2012-04-10 4 views
6

プロローグプログラミングには新しく、チュートリアルで(スクリプト内の)構造のリストを定義して、データベースとしてクエリを実行できるようになっています。しかし、このリストをスクリプト内の変数として定義することは不可能です。私は、このようなプロローグスクリプトでのリストの定義

X=[a,b,c]. 

としてリストを定義するとき、私はちょうど

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

を言って、エラーを受け取るプロローグは、このような定義の変数をサポートしていませんか?私はLinuxでSWI-Prologを使用しています。

答えて

14

我々はアイデンティティ間リテラルを意味するように、論理変数話します。

つまり、プログラムとは、リテラルについて真実を総称するルールのセットであり、リテラルは未解釈です。当社は、個人に関する関係を記述するために変数を使用してルールを作成し、そしてルールを規定して私たちのクエリが真になることができるかどうかを証明しようとしているときに、プロローグ変数をバインドします。

リストという用語は(ヘッド)と(ここでは再帰を注意してください)リスト間の二項関係のためだけの構文砂糖です。通常、データベースについては、アトミックリテラルをバインドするファクト(本文がないルール、常に真です)を使用します。

このチュートリアルでは、おそらくあなたが報告している言葉とは異なる言葉で表現しているか、やや誤解を招くようです。あなたはとにかくなどのデータベース内のリストを格納することができ:

mylist([a,b,c]). 

と同じようにプログラムを書く:しようと、

?- myprog(X). 

とプロローグ:

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

その後、あなたのようなあなたのプログラムを照会することができますmyprog/1を証明しようとすると、mylist/1を証明しようとする/ メンバー/ 2 ... mylist(X)を証明するには、変数 Xは[a、b、c]にバインドされます。

HTH

0

いいえ、このようにすることはできません。あなたは基本的に書いていることは次のとおりです。

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

とエラーは、何ができるかあなたは=/2

を再定義することはできませんと言うようです:

x([a,b,c]). 

、あなたはXを使用したいです:あなたが書く

... 
x(X), 
foo(X) 
... 
5

X = [a, b, c]. 

それは

=/2述語に関する事実の定義として読まれ
=(X, [a, b, c]). 

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

変数は、述語内でローカルにのみスコープされていることをPrologで覚えておく必要があります。どのような仕事とは、次のとおりです。プロローグで

main :- 
    X = [a, b, c], 
    % do stuff with X. 
1

私はプロローグでリストを定義するには、Linuxでswiplを使用しています。

mylist([element1,element2,elementn]). 

次に、あなたのプログラムを照会することができます

?- mylist(A).