2010-02-20 134 views
1

我是Prolog新手,正在嘗試一些東西,特別是我正在考慮如何在序言中做某些事情。我知道的事實和規則,事實是那種Prolog規則幫助

specialCustomer(x).      //person x is a specialcustomer 

和規則的東西:

totalSpend(x,500) :- specialCustomer(x).  //if x spends 500, he is a special customer 

會這一事實,規則是在序言有效嗎?規則是否錯誤?我將如何能夠通過prolog查詢這個?如在電話

totalSpend(bob,500). 

是一個有效的電話?

對不起,如果我回答我自己的問題,我似乎有點......好睏惑!

+0

當你跑它時,你看到了什麼? – 2010-02-20 13:40:46

回答

2

如果你想說,誰花超過500是特殊的客戶,鮑勃,吉姆和每個人,然後定義一些人的消費,你會這樣定義它:

specialCustomer(bob). 
specialCustomer(jim). 
specialCustomer(Who) :- 
    totalSpend(Who, Amount), 
    Amount >= 500. 

totalSpend(mary, 400). 
totalSpend(jack, 600). 
totalSpend(pam, 500). 

然後你會質疑它作爲如下:

?- specialCustomer(jim). 
true. 

?- specialCustomer(mary). 
false. 

?- specialCustomer(jack). 
true. 

?- specialCustomer(pam). 
true. 

?- specialCustomer(X). 
X = bob ; 
X = jim ; 
X = jack ; 
X = pam. 
+0

你從我口中取出了代碼。似乎大部分的困惑是在數據庫中添加一些東西並測試它是否在數據庫中。 – rvirding 2010-02-20 19:53:34

1

你寫的所有內容在語法上都是有效的,但從你的評論來看,它看起來並不像你想要的那樣。

specialCustomer(x). 

這裏你說specialCustomer(x)是真的(和specialCustomer(anything_else)是假的)。

totalSpend(x,500) :- specialCustomer(x). 

在這裏,你的意思是說totalSpend(X,500)爲真當且僅當specialCustomer(x)爲真。既然你已經定義的特殊客戶是真實的,你也可以同樣有書面

totalSpend(x,500). 

您的評論使得它看起來好像你認爲:-之前的部分是它後部分的狀態,但它的另一種方式。

totalSpend(bob,500). 

這裏你問totalSpend(BOB,500)是否是真實的,但因爲是鮑勃沒有規則,這將是錯誤的。

請注意,xbob是符號,而不是變量。所以specialCustomer(x)將是真實的,但specialCustomer(bob)不會。

+0

哦,好吧,我明白了。忘了: - 是在序言中的另一種方式!所以,我正確的想法,而不是它會像這樣: specialCustomer(bob): - totalSpend(bob,500)。 是否可能做到這一點?然後調用totalSpend(bob,500)。將意味着specialCustomer(鮑勃)。是真的? – KP65 2010-02-20 14:07:33

+0

@keval,是的,這是正確的,除了你應該使用一個變量(首字母大寫)而不是普通的原子(最初的小寫字母)。 – 2010-02-20 14:09:26

+0

我明白了,謝謝。我又看了一遍,那種類似的東西:specialCustomer(X)。 totalSpend(500)。折扣(X): - specialCustomer(X),totalSpend(Y)。 我認爲它的權利 – KP65 2010-02-20 14:26:08

0

什麼你可能想表達的是

speccust(bob). 
totalSpend(X,500) :- speccust(X). 

這樣鮑勃是一個特殊的客戶,如果有人花了500,那麼他是一個特殊的客戶。 實際上,您可以將它保存到一個文件中,比如說customer.pl,例如在swi-prolog中加載['customer.pl']來加載它。 然後,您可以將查詢放入數據庫。在這種情況下,您可能想知道誰是特殊客戶,那麼您會聲明:

totalSpend(Who,500)。

並接收Who = bob。

+0

謝謝。這是有道理的,我已經在一個文件中。所以,如果我給了另一個名字,例如tom而不是bob,它將如何存儲在數據庫中? – KP65 2010-02-20 16:11:39

+0

你怎麼表示totalalspend應該大於500而不只是500纔是speccust? – KP65 2010-02-20 16:45:55

+0

如果你想要它適用於湯姆,你需要添加一個事實speccust(湯姆)。 – rvirding 2010-02-20 19:50:58

1

也許你想x是一個變量?爲此,它必須是大寫字母X.