PROLOG:如何排除选项

时间:2014-06-02 15:44:26

标签: prolog

我有这段代码,建议某种动物在这种情况下可以与其他动物共存:

suggest(X) :- bigAnimal(X),bigAnimal(Y),coexist(X,Y),write(Y),nl,fail.

这循环直到失败。我的问题是它还打印出变量 X

enter image description here

如何将它从输出中排除,thx in adcavance。

3 个答案:

答案 0 :(得分:3)

在你的程序中,你通过顶级shell混合查询并使用write/1执行副作用。通过这种方式,你很可能会错过Prolog可以为你提供的很多东西。

相反,坚持纯粹的副作用自由关系,让所有的写作都由顶层完成。

因此,请考虑新的关系,而不是suggest/1,而不是biganimal_compatiblewith/2

biganimal_compatiblewith(X,Y) :-
   bigAnimal(X),
   bigAnimal(Y),
   coexist(X,Y),
   dif(X,Y).     % maybe

?- biganimal_compatiblewith(X,Y).
X = melan,
Y = narty ;
X = melman,
Y = nelman ...

现在,XY都印在了顶层。想一想这种关系与原始suggest/1的比较有用。您可以要求其中一个,或者您甚至可以询问

?- biganimal_compatiblewith(X,X).

您还可以重用此关系,构建更复杂的关系:

?- biganimal_compatiblewith(X,Y), burgervore(Y).

这是Prolog关系的精髓。你可以在很长一段时间内免除副作用。

另一个例子是如何避免不必要的副作用:What are the pros and cons of using manual list iteration vs recursion through fail

答案 1 :(得分:1)

当我有这段代码时:

bigAnimal(elephantas).
bigAnimal(kamilopardali).

coexist(elephantas,kamilopardali).
coexist(kamilopardali,elephantas).
/* coexist has to be symmetric */


suggest(X) :- bigAnimal(X),bigAnimal(Y),coexist(X,Y),write(Y),nl,fail.

结果与预期一致。

2 ?- suggest(elephantas).
kamilopardali
false.
4 ?- suggest(kamilopardali).
elephantas
false.

您不应该使用;结束代码,因为这意味着OR。当我尝试编译时,我收到一个错误。这就是我必须用fullstop(.

结束我的规则的原因

答案 2 :(得分:1)

suggest(X) :-
    bigAnimal(X), bigAnimal(Y), X \== Y, coexist(X,Y), write(Y), nl, fail.