2016-11-21 38 views

回答

2

摘要:

在所有不要擔心這個

這裏有幾個原因:

語法錯誤

首先,這是無效語法。當您諮詢您鏈接到該程序,您可以:

 
ERROR: file.pl:5:28: Syntax error: Operator expected 

表明究竟包含該行:

 
    =(member(X,[H|T]), member[Z|Q])), 

可疑意義

其次,即使我們以某種方式解決這個問題的語法和在此線,例如爲:

 
    =(member(X,[H|T]), member_whatever), 

然後,它仍然是高度可疑這是筆者意思是來表示。

是在這種情況下使用的謂詞是(=)/2,你可以使用中間符號爲寫這篇等效

 
    member(X,[H|T]) = member_whatever, 

而從這個,它已經很清楚,這不能成功,因爲(=)/2甚至不支持更一般的情況

 
    member(_,_) = member_whatever, 

所以,當然在上面更具體的情況下它肯定也會失敗!

根本問題

當Prolog的編程,專注於一個明確說明什麼 持有

例如,聲明說:「在兩個列表出現相同元素」是直截了當:

 
element_in_both(E, As, Bs) :- 
    member(E, As), 
    member(E, Bs). 

這就是它!如下可以讀取它:如果E是  AsE成員是  Bs成員則EAs和  Bs成員。

它的工作原理很普遍,例如:

 
?- length(Cs, _), 
    append(As, Bs, Cs), 
    element_in_both(E, As, Bs). 
Cs = [E, E], 
As = Bs, Bs = [E]; 
Cs = [E, E, _2946], 
As = [E], 
Bs = [E, _2946]; 
Cs = [E, _2940, E], 
As = [E], 
Bs = [_2940, E]. 

您可以使用此謂詞來產生名單,其中這種關係持有,以測試是否它適用於特定的實例,到完成部分列表這樣他們滿足這個謂詞 等

所有這一切都從的條件,使這個關係  持有明確的聲明說明如下。

在Prolog課程中,有一種不必要的複雜化這個相當簡單的聲明式編程基本原理的傾向。不要陷入這個 陷阱。如果你的謂詞變得複雜,你往往會忽略更簡單的東西。

+0

哇,感謝您對語法錯誤的長時間的詳細解釋!仍然學到了一些新的東西(''你可以用這個謂詞來生成這個關係成立的列表」) –

+2

是的,這是邏輯編程的主要吸引力之一:從純粹的說明性描述中,你可以**生成**滿足關係。這對編寫測試用例很有用,而且也可以簡單地研究謂詞:如果你想找出謂詞的含義,可以嘗試最普通的查詢(其中所有參數都是變量),然後向Prolog請求* any *答案!這對於更多地瞭解謂詞非常方便,並且在實踐中非常有用,因爲它使您的代碼非常靈活和緊湊。 – mat