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)ペアが存在するかどうかを確認する必要がある場合は、 Prolog機能を使用できます。たとえば、次の目標は、foo(X,Y) の結果のすべてについて、を満たすa が存在する場合にのみ真になります。Yfoo(X,Y)forall/2YZbar(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.

2 番目の目標:

?- forall(foo(X,Y),bar(Y,Z)).
false.

目標bar(b,Z).が失敗するので。

于 2012-06-02T09:20:23.617 に答える