我是prolog編程的新手,已經在教程中告訴我如何定義結構列表(在腳本中),以便我可以將其作爲數據庫進行查詢。不過,我發現無法將這個列表定義爲腳本中的變量。當我定義爲在prolog腳本中定義列表
X=[a,b,c].
這樣的列表我剛收到一個錯誤說
No permission to modify static_procedure `(=)/2'
是否Prolog的不支持定義變量,如本?我在linux下使用SWI-Prolog。
我是prolog編程的新手,已經在教程中告訴我如何定義結構列表(在腳本中),以便我可以將其作爲數據庫進行查詢。不過,我發現無法將這個列表定義爲腳本中的變量。當我定義爲在prolog腳本中定義列表
X=[a,b,c].
這樣的列表我剛收到一個錯誤說
No permission to modify static_procedure `(=)/2'
是否Prolog的不支持定義變量,如本?我在linux下使用SWI-Prolog。
在Prolog我們講邏輯變量,是指身份文字之間。
也就是說,它是一組規則,它們共同聲明我們的文字是真實的,文字是未解釋的。我們使用變量來編寫規則來描述關於個人的關係,並且當試圖證明我們的查詢是否可以成爲真時,Prolog 按規則規定綁定變量。
一個列表它是一個長期的二元關係,只是語法糖(該頭)和(這裏要注意的遞歸)一個列表。通常,當我們談到數據庫時,我們使用綁定原子文字的事實(沒有主體的規則,總是爲真)。
因此,教程可能用不同的詞語表達任務,而不是您的報告,或者它有點誤導。你可以反正存儲在數據庫中列出這樣:
mylist([a,b,c]).
,寫你的程序,如:
myprog(X) :- mylist(L), member(X, L).
然後你就可以查詢你的程序,如:
?- myprog(X).
和前導,試圖證明MYPROG/1,試圖證明MYLIST/1 和構件/ 2 ... 爲了證明MYLIST(X)的可變 X被綁定到[a,b,c]。
HTH
不,你不能這樣做。那你基本上可以寫爲:
=(X,[a,b,x]).
和錯誤說你不能重新定義=/2
你可以做的是:
x([a,b,c]).
,當你想使用X:
...
x(X),
foo(X)
...
當你寫
X = [a, b, c].
它讀作
=(X, [a, b, c]).
它讀作的關於=/2
謂詞事實的定義。任何自由變量等於[a, b, c]
的事實。也就是說,你重新定義了=/2
。這顯然不是你想要的!
您必須在Prolog中記住變量僅在本地範圍內,在謂詞中。什麼工作是:
main :-
X = [a, b, c],
% do stuff with X.
我用swipl linux下,定義在序言名單。
mylist([element1,element2,elementn]).
然後你就可以查詢你的程序:
?- mylist(A).