在不创建新统一的情况下查找值

时间:2013-05-21 09:51:29

标签: prolog unification

我有一组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]。我怎么能这样做?

1 个答案:

答案 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)。

此外,为什么所有这些削减规则的结束?无用的削减往往是危险的。