[英]Defining a list from scratch in prolog
因此,我需要定義一個列表謂詞: list(.)
,如果列表的形式為cons(b,cons(d,cons(e,cons(h,nil))))
,則返回true。 對於列表bdeh
。
我還需要定義cons(.,.)
二進制謂詞。
到目前為止,我有:
cons(atom(A),nil):- cons(A,nil).
cons(A,B):- cons(A, cons(B,_)).
list(atom(A)):-cons(A,nil).
list(A):- list(cons(_,A)).
但我認為list(.)
謂詞實際上並沒有遍歷我的缺點。 誰能幫忙遍歷列表或繼續進行操作?
我還需要定義
cons(.,.)
二進制謂詞。
根據您的問題, cons/2
不是謂詞,而是函子 。 函子沒有固有的語義含義。 函子用於以某種對程序員有意義的方式來構造數據。
謂詞list/1
需要驗證該參數是否為列表。 有兩件事是清單:
nil/0
常數; 和 cons/2
的復合項,其中第二個元素也是一個列表。 所以我們可以像這樣定義它:
list(nil).
list(cons(_,X)) :-
list(X).
這是如何運作的? 第一個子句只是聲明nil
是一個列表:如果您調用list(nil).
它將成功(“ return” true
)。 如果您不給它nil
,它將檢查第二個子句,看是否給了它cons/2
的復合項 。 如果不是這種情況,該子句(以及謂詞調用)將失敗。 在這種情況下,它將解開復合項。 Prolog對第一個元素(這就是我們稱其為_
),第二個元素(我們命名為X
) 不感興趣,並且Prolog將對該第二個元素執行對list/1
的遞歸調用,以檢查它是否也是一個列表。 因此,它將遍歷嵌套的cons/2
結構,直到找到nil
(或者如果第二個元素不是nil
而不是cons/2
復合項,則更早地將其切斷)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.