20

次の事実と述語を考えると:

sound(time1).
sound(time2).
sun(time3).
relax(X):-sound(X),!,sun(X).
relax(_):-sun(_).

実行すると、「X」が満たされている場合はバックトラックを停止するという(間違っている場合は修正してください)という理由でrelax(S).取得することが期待されます。S=time1!

トレースは次のとおりです。

3 ?- trace.
true.

[trace] 3 ?- relax(S).
   Call: (6) relax(_G1831) ? creep
   Call: (7) sound(_G1831) ? creep
   Exit: (7) sound(time1) ? creep
   Call: (7) sun(time1) ? creep
   Fail: (7) sun(time1) ? creep
   Fail: (6) relax(_G1831) ? creep
false.

それでは、Prologは、 (事実であるため)sun(time1)に満足した後、感嘆符を満たしたにもかかわらず、なぜチェックするのでしょうか。sound(X)sound(time1)

4

3 に答える 3

34

これをさらに明確にするために、誰かが感嘆符演算子の動作にまだ苦労している場合(私が行ったように)、ここに例があります:

sound(time3).
sound(time1).
sun(time1).
relax(X):-sound(X),!,sun(X).

この特定の例では、Prologに?-relax(S).この結果を求めるとfalseになります。Prologは次のように機能していると説明できます。

  1. Prologは、要求された述語を検索します(この例では、 relax(SOMEVARIABLEはSと統合可能))。
  2. Prologは述語relax(X)を見つけます。これで、変数XとSがバインドされました。
  3. Prologは句の評価を開始します:
    • 音(X)
      • Prologは、sound(X)を満たすファクトをファイルで検索します。
      • ファクトサウンド(time3)を見つけます。そしてそれを変数X=S=time3と統合します。
      • Prologは、演算子である次の節に進みます!したがって、彼はこのオペレーターの後ろに戻ることはありません。
    • sun(X)
      • Prologは、sun(X)を満たすファクトをファイルで検索します。Xはすでにバインドされているため、存在しないsun(time3)を検索します。
  4. 結論
    • この時点で、なかった場合!演算子Prologは(backtrack)をsound(X)に戻し、変数X=SをX=S=time1として再割り当てします。事実sun(time1)が存在するため、最終的にはtrueになります。
    • Prologは、どのルールでもrelax(S)に一致しなかったため、falseを返します。

私が4で言ったように反対に!演算子それは成功につながります。

sound(time3).
sound(time1).
sun(time1).
relax(X):-sound(X),sun(X).

ある時点で間違っている場合は、遠慮なく訂正してください。

于 2016-04-03T16:35:52.053 に答える
29

標識は、右側の句が左側に戻るのを防ぎます。!これは一方向のゲートのようなもので、カットを超えて戻ることはありません。

trueの場合sound(time1)、次の節sun(time1)が評価され、その後、prologはそれを見つけますsun(time1)(知識ベースを検索することによって、それが事実であることを実際には知りfalseません)。

次に、カットのため、prologは最初の句で値time2を試行しません。time3

カットの詳細:

Prologは、述語の節を左から右に評価します。左端の句の変数に値をバインドします。句がの場合、true次の句に移動します。の場合false、prologは他の値も試します。

いずれかの節がどの値でも満たすことができない場合、それはでありfalse、述語全体もそうなります(節がANDで結合されているため)。

全体がツリーの深さ優先走査として機能します。ここで、句はノードであり、エッジはその変数のさまざまな値を表します。トラバーサルが節を見つけた場合、false前の節に戻り、別の値を試します。

これがカットです。2つの句の間にカット()を入れると、カット!の句が、になると、カット後に評価が実行された場合にのみ、新しい値の試行が続行されることを意味します。これは、カットがロックされる前に使用された変数の値を意味し、評価がカットを超えたときに変更することはできません。false

于 2013-02-25T11:23:31.713 に答える
4

それでもルールの残りの部分を満たそうとしますが、感嘆符の前に戻ることはありません。つまり、失敗した場合、バックトレースして別のオブジェクトをsun(X)に一致させようとはしませんが、そのルールに完全には一致しません。sound(X)

于 2013-02-25T11:23:22.437 に答える