在我看到these question之后,我试图解决下面的问题。但我无法解决它。任何人都可以帮助我吗?
predefined :
foo( X, Y ) bar( Y, Z )
^ ^ ^ ^
all of them is atomic, that is they only return or take one value at a time
sample example:
foo(john, brad).
bar(john, marry).
foo( Y, brad)
Y = john % after pressing a, all possibilities will be seen at terminal
bar(Y, Z )
Z = marry % after pressing a, all possibilities will be seen at terminal
%..................
对于这些情况,我怎样才能运行具有Y的所有可能性的bar,这是在foo运行之后产生的?
答案 0 :(得分:0)
如果bar/2
是导致某些副作用的谓词,例如输入 - 输出,则会产生回溯,那就是回溯的目的。
你只是说:
?- foo(X,Y),bar(Y,Z).
根据您的实施情况,按a
或;
获取所有可能性。
或者,你可以写
?- foo(X,Y),bar(Y,Z),write(bar(Y,Z)),nl,fail.
另一方面,如果您需要检查满足bar(Y,Z)
的每个Y
是否有foo(X,Y)
对,那么您可以使用Prolog forall/2
工具。例如,只有当foo(X,Y)产生的每个Y
存在满足Z
的{{1}}时,以下目标才会成立。
bar(Y,Z)
<强>实施例强>
鉴于以下事实
?- forall(foo(X,Y),bar(Y,Z)).
有了第一个目标
foo(a,b).
foo(a,c).
bar(c,x).
bar(c,y).
第二个目标:
?- foo(X,Y),bar(Y,Z),write(bar(Y,Z)),nl,fail.
bar(c,x)
bar(c,y)
false.
由于目标?- forall(foo(X,Y),bar(Y,Z)).
false.
失败。