0

我有一组形式的定义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]相反,我希望输出为。我怎样才能做到这一点?

4

1 回答 1

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].

请注意,facts pair/2 在您的程序中没有任何作用,您应该查询一个变量 shared(我使用N2而不是P2)。

另外,为什么在规则结束时进行所有这些削减?无用的切割通常是危险的。

于 2013-05-21T10:07:34.527 回答