10

私はプログラミングをプロローグするのは初めてで、チュートリアルで、構造のリストを (スクリプトで) 定義して、データベースとしてクエリできるようにするように言われました。ただし、このリストをスクリプト内の変数として定義することは不可能です。次のようなリストを定義すると

X=[a,b,c].

というエラーが表示されます

No permission to modify static_procedure `(=)/2'

プロローグはこのような変数の定義をサポートしていませんか? LinuxでSWI-Prologを使用しています。

4

5 に答える 5

21

Prologでは、リテラル間の同一性を意味する論理変数について話します。

つまり、プログラムとは、リテラルについて何が正しいかを集合的に述べる一連の規則であり、リテラルは解釈されないということです。個人に関する関係を記述するために変数を使用してルールを記述し、クエリが真になるかどうかを証明しようとする一方で、Prologはルールに従って変数をバインドします。

リストそれは、項 ( head ) と (ここでの再帰に注意してください)リストの間のバイナリ関係の単なる構文糖衣です。通常、データベースについて話すときは、アトミック リテラルをバインドするファクト (本体のないルール、常に true) を使用します。

そのため、そのチュートリアルは、おそらくあなたが報告したものとは異なる言葉でタスクを表現しているか、誤解を招く可能性があります. とにかく、データベースにリストを次のように保存できます。

mylist([a,b,c]).

次のようにプログラムを記述します。

myprog(X) :- mylist(L), member(X, L).

次に、次のようにプログラムをクエリできます。

?- myprog(X).

Prolog は、myprog/1 を証明しようとして、mylist/1member/2 を証明しようとしています... mylist(L) を証明するために、変数L は [a,b,c] にバインドされます。

HTH

于 2012-04-10T11:26:49.660 に答える
8

あなたが書くとき

X = [a, b, c].

と読みます

=(X, [a, b, c]).

=/2これは、述語に関する事実の定義として読み取られます。任意の自由変数が に等しいという事実[a, b, c]。つまり、 を再定義し=/2ます。それは明らかにあなたが意図したものではありません!

Prolog では、変数は述語内でローカルにのみスコープされることを覚えておく必要があります。何がうまくいくでしょうか:

main :-
    X = [a, b, c],
    % do stuff with X.
于 2012-04-10T10:55:39.583 に答える
1

いいえ、このようにすることはできません。あなたは基本的に何を書いていますか:

=(X,[a,b,x]).

エラーが示すように、=/2 を再定義することはできません

あなたができることは次のとおりです。

x([a,b,c]).

X を使用する場合:

...
x(X),
foo(X)
...
于 2012-04-10T10:54:18.753 に答える