就像在每种编程语言中一样,您必须将其分解为多个步骤。第一步,用您自己的话说,“找到符号等于索引变量的连接”。
这很简单:
predicate(Connections, [Index,Position], Remaining) :-
select(conn(Index, Position, _), Connections, Remaining).
predicate(Connections, [Index, Position2], Remaining) :-
select(conn(Index, _, Position2), Connections, Remaining).
这两个都有一个new_pos
我们想要保留的匿名变量,所以让我们保留它:
predicate(Connections, [Index, Position], Remaining) :-
select(conn(Index, Position, NewPos), Connections, Remaining).
predicate(Connections, [Index, Position2], Remaining) :-
select(conn(Index, NewPos, Position2), Connections, Remaining).
另一种方法:
predicate(Connections, [Index, Position], Remaining) :-
select(conn(Index, Position, NewPos), Connections, Remaining) ;
select(conn(Index, NewPos, Position), Connections, Remaining).
事实上,这将是完美的,但我们需要NewPos
从某个地方昏倒,否则 Prolog 将永远不会向我们展示它统一到什么。
select_position(Connections, [Index,Pos], Remaining, NewPos) :-
select(conn(Index, Pos, NewPos), Connections, Remaining) ;
select(conn(Index, NewPos, Pos), Connections, Remaining).
下一步是找到连接。这也不难:
find_with_position(Position, Connections, Connection) :-
member(Connection, Connections),
(Connection = conn(_, Position, _) ;
Connection = conn(_, _, Position)).
这两个都有一些特殊的逻辑来处理任何一个项目都可能是正确的这一事实。您可能需要考虑使用列表,这样您就可以使用成员。
将它们粘合在一起并不难:
predicate(Connections, [Index, Position], Remaining, Target) :-
select_position(Connections, [Index, Position], Remaining, NewPos),
find_with_position(NewPos, Remaining, conn(Target,_,_)).
试试看:
?- predicate([conn(1,p1,p2), conn(4,p2,p3),
conn(3,p3,p1), conn(2,p6,p7)], [1, p2], Left, T).
Left = [conn(4, p2, p3), conn(3, p3, p1), conn(2, p6, p7)],
T = 3 ;
false.
你这里有很多问题。如果您正在为课程学习 Prolog,我鼓励您学习教程,例如Learn Prolog Now或Amzi Adventure。