我有这段代码,建议某种动物在这种情况下可以与其他动物共存:
suggest(X) :- bigAnimal(X),bigAnimal(Y),coexist(X,Y),write(Y),nl,fail.
这循环直到失败。我的问题是它还打印出变量 X
如何将它从输出中排除,thx in adcavance。
答案 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 ...
现在,X
和Y
都印在了顶层。想一想这种关系与原始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.