1. ホーム
  2. list

[解決済み] Prologにおける"!"とは

2022-01-31 10:45:59

質問

Prologで"!"は何をするのか、どなたか説明していただけませんか?私はそれを理解することはできません。 ここに、異種リストのどれだけのサブリストが山の側面を持つかをカウントするコードがあります。

nrSubliste([], 0).
nrSubliste([H|T], R):-
    is_list(H),
    munteMain(H),!,
    nrSubliste(T, R1),
    R is R1 + 1.
nrSubliste([_|T], R):-
    nrSubliste(T, R).

munteMain は、線形リストが山の側面を持つかどうかを検証します。

どのように解決するの?

感嘆符 ! カット は、Prologでは常に成功する特別なゴールであり、ブロックの バックトラック は、その上にあるすべての分岐で、代替案がある可能性があります。

あなたの場合は、いったん munteMain/1 が見つかった場合、プログラムは決して後戻りして別の解決策を探すことはありません。具体的には、Prologは、あなたの nrSubliste/2 ルール、すなわち、リストヘッドを無視して _ もし H は、次のようなものです。 munteMain(H) は成功する。

を使用することに注意してください。 ! というのも、第3節のロジックは第2節のロジックに依存するため、コードが多少読みにくくなり、メンテナンスもしにくくなるからです。カットなしでプログラムを書き直すには 証明できない 演算子 \+ :

nrSubliste([H|T], R):-
    is_list(H),
    munteMain(H),
    nrSubliste(T, R1),
    R is R1 + 1.

nrSubliste([H|T], R):-
    is_list(H),
    \+ munteMain(H),
    nrSubliste(T, R).