0

在我看到这些问题之后,我试图解决以下问题。但我无法解决。谁能帮我 ?

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

   %..................

对于这些情况,我如何在 foo 的 eash 运行后产生 Y 的所有可能性来运行 bar?

4

1 回答 1

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),那么您可以使用 Prologforall/2工具。Y例如,仅当对于foo(X,Y) 产生的每个结果,都存在Z满足的 时,以下目标才会成立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.

由于目标bar(b,Z).失败。

于 2012-06-02T09:20:23.617 回答