現在の入力ストリームから文を読み取り、単語間の複数の空白が単一の空白文字に置き換えられるように再フォーマットされた同じ文を出力する、この単純な Prolog の例の宣言的な解釈に関連して、私はいくつかの疑問を抱いています。
これは私のプログラムのコードです:
squeeze :- get0(C), % Legge un carattere dallo standard input(anche blank)
put(C), % Scrive il carattere sullo standard output
dorest(C). % Fà tutto il resto.
dorest(46) :- !. % 46 è il carattere ASCII per lo stop: tutto completato.
dorest(32) :- !, % 32 è il carattere ACII per blank, impedisci backtrack
get(C), % Legge un carattere dallo standard input (non blank)
put(C), % Scrive il carattere sullo standard output
dorest(C). % Fà tutto il resto.
dorest(Letter) :- squeeze.
宣言的な読み方とカットの使用に関連していくつかの疑問があります...私の解釈が正しいかどうか、または何かが欠けているかどうか教えていただけますか?
すべては、Prolog シェルでスクイーズ述語を呼び出したときに開始されるため、論理的には、スクイーズ述語が TRUE または FALSE であることを確認する必要があります...
squeze predicate は、ルール本体にあるすべてのものが TRUE の場合に TRUE です: 文字を読み取った (空白でもある) 必要があり、かつこの文字を出力に配置し、dorest(C)述語が TRUE であるかどうかを確認します (C は読み取られた文字です)。 )
dorest(C)はプログラムの中核です。
IF C は、a に対応する ASCII コード文字 46 です。(終止符): バックトラックを防止し (プログラムは他の dorest ルールを試すことができません)、dorestが true であることを検証します。そのため、squeeze述語は TRUE として検証され、プログラムは終了します。
IF C は空白文字に対応する ASCII コード文字 32 です: バックトラッキングを防止します (プログラムは他の dorest ルールを試すことができません)すべての空白文字をスキップするget述語を検証し、現在の出力ストリームに C を書き込みますスクイーズを確認する
IF C が一般的な文字である場合は、squeeze を検証するだけです (これにより、文字列の読み取りにサイクルのようなものが誘発されます)。
したがって、この場合、CUT 演算子の使用を確認できます。dorestルール間の相互排除を作成するため、IFのようなものを誘導する方法として
それは正しいですか、それとも何か不足していますか?