2

ターミナルで「prolog」と入力すると、次のようになります。

GNU Prolog 1.3.0

By Daniel Diaz

Copyright (C) 1999-2007 Daniel Diaz

| ?- 

タイピング:

| ?- member(2, [1,2,3]).

取得:

true ? 

次にEnterを押すと、次のようになります。

yes

タイピング:

| ?- member(4, [1,2,3]).

取得:

no

ファイルを書くとき; これで構成されるtest.pl:

:- member(4, [1,2,3]), nl, halt.

そして、ターミナルに次のように書き込みます。

| ?- [test2].

私は得る:

compiling /path/test.pl for byte code...
/path/test.pl:1: warning: unknown directive (',')/2 - maybe use initialization/1 - directive ignored
/path/test.pl compiled, 1 lines read - 139 bytes written, 11 ms

yes

ここでの答えはノーであるべきではありませんか?私は何を間違っていますか。また、プロローグでこれを行う方法は次のとおりです。

if (testInPrologTerminal(member(4, [1,2,3])) { do this; } 

つまり、プロローグのトップ レベルにクエリを送信し、回答を取得したい

4

1 に答える 1

3

querymember(2, [1,2,3])を入力すると、GNU Prolog は可能な追加の解決策を求めるプロンプトを出します (したがって、true ?プロンプトが表示されます)。Enter キーを押すと、現在のソリューション (リストの 2 番目の位置にある要素 2) に満足していることをトップレベルのインタープリターに伝えています。2 番目のクエリ にmember(4, [1,2,3])は解がないため、 が得られますno

ファイルがロードされたときにクエリを実行するには、標準的で移植可能な方法として、標準initialization/1ディレクティブを使用します。この場合、次のように記述します。

:- initialization((member(4, [1,2,3]), nl, halt)).

() でクエリが囲まれていることに注意してください。そうしないと、不明initialization/3な標準の組み込み制御構造に関する警告が表示される場合があります。ファイルのロード時に実行するより複雑なクエリがある場合は、クエリをinitialization/1ディレクティブからのこの述語の呼び出しにする述語を定義します。例えば:

main :-
    (   member(4, [1,2,3]) ->
        write('Query succeeded!'), nl
    ;   write('Query failed!'), nl
    ).

:- initialization(main).

任意のクエリをディレクティブとしてソース ファイルに記述することは、従来の慣行であるため、いくつかの Prolog 実装で受け入れられていますが、initialization/1ディレクティブを使用することは、よりクリーンで標準的で移植可能な代替手段です。

于 2014-09-11T10:10:44.530 に答える