0

現在の入力ストリームから文を読み取り、単語間の複数の空白が単一の空白文字に置き換えられるように再フォーマットされた同じ文を出力する、この単純な 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のようなものを誘導する方法として

それは正しいですか、それとも何か不足していますか?

4

1 に答える 1

1

はい、その通りです。実際、ここではカットを使用して IF 構造を作成しています。このコードは、'->'構造を明示的に書き直すことができます。

squeeze :- get0(C), put(C), dorest(C).

dorest(C):-
  (  C = 46 -> true ;
     C = 32 -> get(C), put(C), dorest(C) ;
     squeeze
  ).

ご覧のとおり、squeezedorestは相互に再帰的な手順です。squeezeは何かを実行してから を呼び出しますdorest。これは、停止するか、何かを実行するか、コールsqueezeバックします。

したがって、このプログラムは、ドットが検出されるまでユーザー入力を読み取り、各文字をエコー バックするループを記述します。いくつかの連続するスペースを 1 つのスペースに絞り込む:

9 ?- squeeze.
|: 12 34   56
12 34 56
|: asd  432 123-432   56.
asd 432 123-432 56.

Yes
10 ?- squeeze.
|: 123   43 23   .rewe ew wew ew e
123 43 23 .

Yes

これは操作上の解釈であり、宣言的な解釈ではありません。I/O は「存在する」ことではなく、「行う」ことです。これが、上記の「述語」の代わりに「手続き」という言葉を使用した理由です。

于 2013-04-17T19:04:59.080 に答える