将函数结果映射到另一个

时间:2012-06-02 09:07:45

标签: prolog

在我看到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运行之后产生的?

1 个答案:

答案 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. 失败。