[解決済み] Prologにおけるエクスクラメーションマーク
質問
次の事実と述語がある。
sound(time1).
sound(time2).
sun(time3).
relax(X):-sound(X),!,sun(X).
relax(_):-sun(_).
を実行する場合
relax(S).
期待するのは
S=time1
により
!
これは、(間違っていたら訂正してください)「X」が満たされたら、バックトラックを停止する、というものです。
以下はそのトレースです。
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)
はファクトです)。
解決方法は?
その
!
記号は、その右側の節を左側に後退させないように、一方通行のゲートのようなもので、切り口を越えて後退することがないようにします。
いつ
sound(time1)
が真であれば、次の節
sun(time1)
が評価され、その時初めてPrologは
sun(time1)
は
false
(ナレッジベースを検索することで、実際には
知っている
事実であること)。
それから、カットのために、prologは値を試さない。
time2
と
time3
を最初の節に追加しました。
カットの詳細
Prologは述語の節を左から右へ評価します。そして、一番左の節にある変数に値を束縛します。もし、節が
true
であれば、次のものに移る。もし、それが
false
Prologは他の値も試します。
もし、どの値でも満たすことができない節があれば、それは
false
となり、述語全体がそうなります(節がANDで結合されているため)。
全体は、節がノード、辺がその変数の異なる値を表す木の深さ優先探索として動作します。もし探索がある節が
false
であれば、その前の節に戻り、別の値を試すことになる。
ここで、カットが入ります。もし、カット(
!
) の間にある場合、その節が
後
になります。
false
新しい値を試すのは、カットの後に評価が実行される場合のみです。つまり、カットの前に使われた変数の値は
ロック
そのため、評価結果がカットをまたぐと、変更することができません。
関連
-
[解決済み】Prolog - 引数が十分にインスタンス化されていない
-
[解決済み] "シンタックスエラー。Prologで「演算子が期待されています。
-
[解決済み] Prologにおけるエクスクラメーションマーク
-
[解決済み] SWI-Prologでリストから重複を削除する方法は?
-
[解決済み] Prolog - 回文ファンクタ
-
[解決済み] Prologは初めてです。このコードを実行しようとすると、 - ERROR: Undefined procedure: teaches/2 (DWIM could not correct goal) が表示されます。
-
[解決済み] Prologの未定義手続きエラー
-
[解決済み] Prologでは%記号はどのような意味ですか?
-
[解決済み] Prologにおける"˶‾‾‾"とは何ですか?
-
[解決済み] 論理プログラミングに関して、PrologとminiKanrenの主な技術的な違いは何でしょうか?[クローズド]。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Prolog - 引数が十分にインスタンス化されていない
-
[解決済み] "シンタックスエラー。Prologで「演算子が期待されています。
-
[解決済み] Prologにおけるエクスクラメーションマーク
-
[解決済み] SWI-Prologでリストから重複を削除する方法は?
-
[解決済み] Prolog - 回文ファンクタ
-
[解決済み] Prologは初めてです。このコードを実行しようとすると、 - ERROR: Undefined procedure: teaches/2 (DWIM could not correct goal) が表示されます。
-
[解決済み] Prologの未定義手続きエラー
-
[解決済み] Prologにおける"˶‾‾‾"とは何ですか?
-
[解決済み] Prolog ㊙と㊙の違いは何ですか?
-
[解決済み] 論理プログラミングに関して、PrologとminiKanrenの主な技術的な違いは何でしょうか?[クローズド]。