簡體   English   中英

在序言中從頭開始定義列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM