2

!句の最初にカット ( ) を入れるとはどういう意味ですか?

  p(X,Y) :- !, q(X), r(X,Y).

!failと どのように関連しています はどう 違いますか?

ありがとう。for 、述語は「失敗」するだけ
だと思います笑バックトラックしないのとは違いますか?fail確認したいだけです:)

4

1 に答える 1

4

通常、これは、変数のインスタンス化の特定の組み合わせでバックトラックがないことを確認したい場合に使用します。いくつかのコードを表示するには (SWI-Prolog 実装から少し借用) :

read_lines(In, Ls) :-
    read_line_to_codes(In, Codes),
    read_lines_rest(Codes, In, Ls).

read_lines_rest(end_of_file, _, []) :- !.
read_lines_rest(Codes, In, [Codes|Rest]) :-
    read_line_to_codes(In, New_codes),
    read_lines_rest(New_codes, In, Rest).

これらの述語を定義すると、入力ストリーム (ファイルなど) を行のリストに読み込むことができます。read_line_to_codes/2から使用していlibrary(readutil)ます。2 番目の引数を、行を表すコードのリスト、またはend_of_file入力の末尾のアトムと統合します。

の最初の節でread_lines_read/3は、述語定義の先頭で単一化を使用しています。end_of_file述語を考慮したい場合は、最初の引数がアトムでなければならないことを「要求」します。(入力の最後で) この句が成功すると、定義の 2 番目の句の他の可能な解決策は考慮されず、述語が成功し、3 番目の引数のリストが閉じられます。

ここで使用されます:

?- open('shortcut.pl', read, In), read_lines(In, Ls), forall(member(L,Ls), format("~s~n", [L])).
read_lines(In, Ls) :-
    read_line_to_codes(In, Codes),
    read_lines_rest(Codes, In, Ls).

read_lines_rest(end_of_file, _, []) :- !.
read_lines_rest(Codes, In, [Codes|Rest]) :-
    read_line_to_codes(In, New_codes),
    read_lines_rest(New_codes, In, Rest).
% variable instantiations

述語が 1 回だけ成功することに注意してください。最初の句のカットを削除して、何が起こるかを確認してください。

についてはfail、はい、述語を失敗させます(成功しません)。この時点で、選択ポイントが残っている場合、Prolog は最新の選択ポイントに戻ります。

于 2015-02-24T12:49:14.580 に答える