2017-11-14 3 views
0

Ich lerne gerade Prolog und das Konzept der Differenzlisten in Prolog, also bitte mit mir.Prolog "append_dl/3" wrapper

Ich habe folgenden Code:

:- op(400, xfx, \). 

append(Xs, Ys, Zs) :- 
    append_dl([Xs|T1]\T1, [Ys|T2]\T2, Zs\[]). 

append_dl(Xs\Ys, Ys\Zs, Xs\Zs). 

Wenn ich nun Listen anhängen [1,2,3] und [a, b, c] in der SWI-Interpreter es Listen von Listen

?- append([1,2,3],[a,b,c],Zs). 
Zs = [[1, 2, 3], [a, b, c]]. 
ergibt

Während, wenn ich rufe append_dl direktly wie so:

?- 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]. 

es funktioniert ...

Was mache ich falsch und wie sollte man diese Funktionen mit Differenzlisten korrekt umschlingen?

Danke Jungs für die Hilfe: D

+0

Zu Ihrem Problem .... das Problem ist, dass Ihr indirekter Aufruf von 'append ([1,2,3], [a, b, c], Zs). 'Tatsächlich' append_dl ([[1 , 2,3] | T1] \ T1, [[a, b, c] | T2] \ T2, Zs \ []). 'Nicht' append_dl ([1,2,3 | T1] \ T1, [a , b, c | T2] \ T2, Zs \ []). '. Also, die inkonsistenten Ergebnisse. – lurker

+0

Ahh Ok, ich verstehe. Danke: D –

+1

Das Format meines vorhergehenden Kommentars reparierend ... FYI, müssen Sie \ als Operator nicht definieren. Das \ ist eine "ältere" Art, eine Differenzliste zu begrenzen. Ein Bindestrich (-) wird oft in der neueren Literatur gefunden, zum Beispiel *, append_dl (Xs-Ys, Ys-Zs, Xs-Zs). – lurker

Antwort

3

Während dieser Programmiertechnik ist der Schlüssel zum Prolog, diese append_dl/3 ist ein sehr künstliches Beispiel, dass niemand in dieser präzisen Art und Weise verwendet. Es gibt einen Prolog Lehrbuch (Art der Prolog), die dies als die erste „motivierende“ Beispiel verwendet und einige Kurse noch solche Lehrbücher folgen wahrsten Sinne des Wortes ...

(Lassen Sie uns die gemeinsame Definition von append/3 halten, wie es in der Regel definiert ist)

Differenzlisten sind keine Listen. Sie sind vielmehr Unterschiede zwischen Listen. So Listenunterschied wäre ein passender Name für sie. In den meisten Situationen sind solche Unterschiede nicht vorhanden, stattdessen müssten Sie eine tatsächliche Liste in einen solchen umwandeln oder (häufiger) den Unterschied konstruieren, während Sie weitermachen.

Also nehmen Sie die Liste [1,2,3], die durch den Unterschied [1,2,3|Xs]\Xs dargestellt werden kann. Eine andere Möglichkeit, es darzustellen, wäre [1,2,3]\[]. Aber Sie können append_dl/3 nur verwenden, wenn die Unterschiede in ihrer allgemeinsten Form dargestellt werden, die Sie nicht haben. Daher müssen Sie zuerst reguläre Listen in diese Darstellung konvertieren.

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\[]). 

In diesem konkreten Beispiel war die Konvertierung nur Overhead. Sie benötigten das eingebaute append/3 zweimal. Auch mappend(XsL, YsL, [1,2]) wird nicht beendet, während append(XsL, YsL, [1,2]) tut. Für diesen Fall müssten Sie die Reihenfolge der Ziele ändern.

Nachdem Sie in dieser Aufgabe gegeben haben, würde ich empfehlen, Sie Prolog Notation zu studieren.