2

私は Prolog の完全な初心者であり、使用方法を知りたいと思っていましたground/1

現時点では、次のコードがあります。

intertwine([], [], []).
intertwine([E|Es], Fs, [E|Gs]) :- intertwine(Es, Fs, Gs).
intertwine(Es, [F|Fs], [F|Gs]) :- intertwine(Es, Fs, Gs).

しかし、シェルでこれを呼び出そうとすると:

intertwine([1,2],X,[1,a,2,b]).

正しい答えが得られX=[a,b]ますが、別の答えが残っていると思われるかのように、クエリは終了しません。だから、「;」を押します そして、出力として「false」を取得します。ground/1 ケースを処理するために3番目のリストがすでに完全にインスタンス化されているかどうかを確認するために使用する必要がある別の質問の回答を読みました。

つまり、完全な初心者なので、その方法がわからないのです。それで、地面がどのように機能するか、それを使用して特定のパラメーターのインスタンス化をチェックし、それを使用してコードが存在しない答えをチェックしないようにする方法を説明してくれる親切な人はいますか?

4

3 に答える 3

2

その振る舞いは完全にOKです。Prolog は、それ以上の解決策がないことを理解できる場合もあれば、そうでない場合もあります。詳細は、説明されている内容と違いはありません。検討:

?- X = 1 ; 2 = 3.
X = 1 ;
false.

ここで、それが解決策ではないことは明らかですが2 = 3、それでも Prolog は続行するように求めています。

ところで、代わりに; SPACE を押して次のソリューションを取得することもできます。

于 2011-12-02T04:25:09.707 に答える
0

パラメータの設定を確認するには、 Ground /1の代わりにvar/1 (または関連する nonvar/1) の使用を検討する必要があります。var/1は、言語の純粋なサブセットとして知られているものを超えて Prolog の力を拡張する基本的なメタ述語です。変数などの基本的なエンティティの「状態」に応じて適切な動作を選択し、プログラム自体について推論することができます。

実用的なプログラミングの POV から、これらのメタ述語を (非常に) 簡単に使用すると、特定のパラメーターのデフォルト値を実装できます。

%%  gunzip(+Gz, ?Ex) is det.
%
%   uncompress the file Gz in Ex
%   if Ex is var strip .gz extension
%
gunzip(Gz, Ex) :-
    (   nonvar(Ex)
    ->  true
    ;   atom_codes(Gz, Cs),
        phrase(string(ExCs), Cs, ".gz"),
        atom_codes(Ex, ExCs)
    ),
    gzopen(Gz, read, I, [type(binary)]),
    setup_call_cleanup(open(Ex, write, O, [type(binary)]),
               copy_stream_data(I, O),
               ( close(I), close(O) )
              ).

gunzip('file.gz', F) を呼び出すと、F は (できれば) 膨張したデータの名前でインスタンス化されます。

于 2011-12-02T10:18:46.767 に答える
0

false が言ったように、この動作は本当に問題ありません。ground/1述語は実際にはその質問とは関係ありません。

そこにない答えをコードでチェックしないようにするには?

あなたの質問が正しければ、カットはここで役に立ちます。

intertwine([], [], []).
intertwine([E|Es], Fs, [E|Gs]) :- intertwine(Es, Fs, Gs), !.
intertwine(Es, [F|Fs], [F|Gs]) :- intertwine(Es, Fs, Gs), !.

それで、あなたはあなたの唯一の答えを手に入れました。

?- intertwine([1,2],X,[1,a,2,b]).
X = [a, b].

?- 
于 2011-12-02T04:28:37.420 に答える