我有一组pair/2
形式和谓词propagate/3
的定义:
pair(1, 2).
pair(2, 3).
pair(3, 4).
pair(4, 5).
propagate([], _, []) :- !.
propagate([pair(N, Num)|Tail], Num, [N|ResultTail]) :-
propagate(Tail, Num, ResultTail), !.
propagate([pair(Num, N)|Tail], Num, [N|ResultTail]) :-
propagate(Tail, Num, ResultTail), !.
propagate([_|Tail], Num, Result) :-
propagate(Tail, Num, Result), !.
如果我有List = [pair(1, 2), pair(2, 3), pair(3, 4), pair(4, 5)]
而我做
propagate(List, 2, Result).
我得到了所需的输出Result = [1, 3]
;即与2
形成配对的所有数字的列表。
但是,如果我有List = [pair(N1, N2), pair(N2, N3), pair(N3, N4), pair(N4, N5)]
而我有<{p>
propagate(List, N2, Result)
然后输出
N2 = N3, N3 = N4, N4 = N5,
Result = [N1, N5, N5, N5].
我希望输出为Result = [N1, N3]
。我怎么能这样做?
答案 0 :(得分:1)
(==)/ 2可以解决问题
propagate([], _, []) :- !.
propagate([pair(N, X)|Tail], Num, [N|ResultTail]) :-
X == Num,
propagate(Tail, Num, ResultTail), !.
propagate([pair(X, N)|Tail], Num, [N|ResultTail]) :-
X == Num,
propagate(Tail, Num, ResultTail), !.
propagate([_|Tail], Num, Result) :-
propagate(Tail, Num, Result), !.
产量
?- List = [pair(N1, N2), pair(N2, N3), pair(N3, N4), pair(N4, N5)], propagate(List,N2,Result).
List = [pair(N1, N2), pair(N2, N3), pair(N3, N4), pair(N4, N5)],
Result = [N1, N3].
请注意,事实对/ 2在您的程序中不起任何作用,您应该查询共享变量(我使用N2
代替P2
)。
此外,为什么所有这些削减规则的结束?无用的削减往往是危险的。