我有一组形式为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)],如果我有
propagate(List, N2, Result)则输出为
N2 = N3, N3 = N4, N4 = N5,
Result = [N1, N5, N5, N5].相反,我希望输出为Result = [N1, N3]。我该怎么做呢?
发布于 2013-05-21 18:07:35
(==)/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)。
另外,为什么在规则的末尾有这么多的删减?无用的削减通常是危险的。
https://stackoverflow.com/questions/16667038
复制相似问题