[英]Prolog “append_dl/3” wrapper
我只是在學習Prolog和Prolog中差異列表的概念,所以請多多包涵。
我有以下代碼:
:- op(400, xfx, \).
append(Xs, Ys, Zs) :-
append_dl( [Xs|T1]\T1, [Ys|T2]\T2, Zs\[]).
append_dl( Xs\Ys, Ys\Zs, Xs\Zs).
現在,如果我在SWI解釋器中附加列表[1,2,3]和[a,b,c],則會產生列表列表
?- append([1,2,3],[a,b,c],Zs).
Zs = [[1, 2, 3], [a, b, c]].
而如果我確實像這樣直接調用append_dl:
?- append_dl([1,2,3|T1]\T1,[a,b,c|T2]\T2,Zs\[]).
T1 = [a, b, c],
T2 = [],
Zs = [1, 2, 3, a, b, c].
有用...
我在做什么錯,應該如何使用差異列表正確包裝這些功能?
謝謝大家的幫助:D
盡管此編程技術是Prolog的關鍵,但此append_dl/3
是一個高度人為的示例,沒有人以這種精確的方式使用。 有一本Prolog教科書(Art of Prolog),將其用作第一個“激勵性”示例,並且某些課程實際上仍沿用此類教科書...
(讓我們保持通常定義的append/3
的通用定義)
差異列表不是列表。 相反,它們是列表之間的差異。 因此, 列表差異將是一個更合適的名稱。 在大多數情況下,您尚未准備好此類差異,而是必須將實際列表轉換為此類差異,或者(通常)構造差異。
因此,采用可以由差[1,2,3|Xs]\\Xs
表示的列表[1,2,3]
。 表示它的另一種方法是[1,2,3]\\[]
。 但是,只有當差異以您沒有的最一般的形式表示時,才可以使用append_dl/3
。 因此,您首先需要將常規列表轉換為該表示形式。
mappend(XsL, YsL, ZsL) :-
append(XsL, Xs,Xs0), % convert XsL to a difference Xs0\Xs
append(YsL, Ys,Ys0), % convert YsL to a difference Ys0\Ys
append_dl( Xs0\Xs, Ys0\Ys, ZsL\[]).
在這個具體示例中,轉換只是開銷。 您需要兩次使用內置的append/3
。 而且, mappend(XsL, YsL, [1,2])
不會終止,而append(XsL, YsL, [1,2])
會終止。 在這種情況下,您將需要更改目標的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.