2012-04-10 93 views
6

我是prolog編程的新手,已經在教程中告訴我如何定義結構列表(在腳本中),以便我可以將其作爲數據庫進行查詢。不過,我發現無法將這個列表定義爲腳本中的變量。當我定義爲在prolog腳本中定義列表

X=[a,b,c]. 

這樣的列表我剛收到一個錯誤說

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

是否Prolog的不支持定義變量,如本?我在linux下使用SWI-Prolog。

回答

14

在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

0

不,你不能這樣做。那你基本上可以寫爲:

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

和錯誤說你不能重新定義=/2

你可以做的是:

x([a,b,c]). 

,當你想使用X:

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

當你寫

X = [a, b, c]. 

它讀作

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

它讀作的關於=/2謂詞事實的定義。任何自由變量等於[a, b, c]的事實。也就是說,你重新定義了=/2。這顯然不是你想要的!

您必須在Prolog中記住變量僅在本地範圍內,在謂詞中。什麼工作是:

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

我用swipl linux下,定義在序言名單。

mylist([element1,element2,elementn]). 

然後你就可以查詢你的程序:

?- mylist(A).