如何为Prolog“或”操作返回单个值?

时间:2018-06-02 19:18:08

标签: prolog

我的代码中有以下规则:

in(rome, lacio).
in(lacio, italy).
in(salvador, bahia).
in(bahia, brazil).

is_in(X, Z) :- (in(X, Y), in(Y, Z)) ; in(X, Z).

因此,如果我问is_in(rome, lacio).它会返回true,这是预期的,但如果我问is_in(rome, italy).它会返回true然后false,可能是因为is_in/2中的第二个词。

我应该做些什么来阻止它返回两个结果而只返回true,就像在正常的“或”操作中一样?我虽然“;”会照顾它,但它没有按照我的预期发挥作用。

1 个答案:

答案 0 :(得分:0)

部分效果最好:

is_in(X, Z) :- in(X, Z), !, true.
is_in(X, Z) :- in(X, Y), in(Y, Z).

但您也可以使用或:

is_in(X, Z) :- in(X, Z), !, true; in(X, Y), in (Y, Z).

我添加的额外内容阻止Prolog从该选择点分支并返回true,因为在这种情况下它是。不过要小心这样做,它可能会导致大型程序出现问题。