我只是在學習Prolog,偶然發現了以下問題:Prolog - Seeing if the same element occurs in two lists。會員[H | T]是什麼意思?
此問題包括以下行:=(member(X,[H|T]), member[Z|Q]))
。
我知道member(?Elem, ?List),但我不明白member[Z|Q]
部分。這是什麼意思?是不是有太多關閉的假設?
我只是在學習Prolog,偶然發現了以下問題:Prolog - Seeing if the same element occurs in two lists。會員[H | T]是什麼意思?
此問題包括以下行:=(member(X,[H|T]), member[Z|Q]))
。
我知道member(?Elem, ?List),但我不明白member[Z|Q]
部分。這是什麼意思?是不是有太多關閉的假設?
摘要:
在所有不要擔心這個。
這裏有幾個原因:
首先,這是無效語法。當您諮詢您鏈接到該程序,您可以:
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
是 As
和E
成員是 Bs
成員則E
是既As
和 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課程中,有一種不必要的複雜化這個相當簡單的聲明式編程基本原理的傾向。不要陷入這個 陷阱。如果你的謂詞變得複雜,你往往會忽略更簡單的東西。
哇,感謝您對語法錯誤的長時間的詳細解釋!仍然學到了一些新的東西(''你可以用這個謂詞來生成這個關係成立的列表」) –
是的,這是邏輯編程的主要吸引力之一:從純粹的說明性描述中,你可以**生成**滿足關係。這對編寫測試用例很有用,而且也可以簡單地研究謂詞:如果你想找出謂詞的含義,可以嘗試最普通的查詢(其中所有參數都是變量),然後向Prolog請求* any *答案!這對於更多地瞭解謂詞非常方便,並且在實踐中非常有用,因爲它使您的代碼非常靈活和緊湊。 – mat