簡體   English   中英

Prolog“ append_dl / 3”包裝器

[英]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])會終止。 在這種情況下,您將需要更改目標的順序。

在分配作業后,我建議您學習Prolog的表示法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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