我的代码中有以下规则:
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
,就像在正常的“或”操作中一样?我虽然“;”会照顾它,但它没有按照我的预期发挥作用。
答案 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,因为在这种情况下它是。不过要小心这样做,它可能会导致大型程序出现问题。