2016-11-22 2 views
0

Say ITaking von einem Element in einer Liste Prologs

[5,4,6,9] 

Und ich will von der Spitze der Liste eine Liste haben wegzunehmen, aber den Rest der Liste

so zurück: -3

[2,4,6,9] 

-2

[3,4,6,9] 

Und dann will ich so auf das nächste Element bewegen,

-3

[5,1,6,9], 

-2

[5,2,6,9] 

Wie könnte ich einen Prolog-Prädikat für diese produzieren,

bis jetzt habe ich

change([],[]). 
change([Head|Tail], [Head1|Tail]):- 
    process(Head, Head1). 


process([],[]). 
process(Head, Head1):- 
    Head1 is Head-3, 
    Head1 >=0. 

process(Head, Head1):- 
    Head1 is Head-2, 
    Head1 >=0. 

Ich bin mir nicht sicher, was ich in meinem rekursiven Anruf zurückgeben würde, jede Hilfe wäre großartig danke

+0

Sie möchten nur Kopf und zweites Element ändern und andere Liste so lassen, wie sie ist? Und das willst du auch nur mit -2, -3 oder mit einer bestimmten Zahl ?? – coder

+0

Ich möchte -2 und -3 von jedem Element in der Liste einzeln entfernen @coder – user3667111

+0

Aber in Ihrem Beispiel, was sollte die Ausgabe mit Eingabe sein [5,4,6,9] ?? (Sie beschreiben einige Änderungen, aber was ist die erwartete Ausgabe genau?) – coder

Antwort

2

Die Art, wie Ihr Code derzeit geschrieben wird versucht es mehr als ein Listenelement in einer bestimmten Lösung zu ändern. Die Anforderung scheint jedoch zu sein, nur ein Listenelement zu ändern. Die Verwendung von CLP (FD) hilft bei der Arithmetik.

change([], []).   % Nothing to change 
change([X|T], [Y|T]) :- % Change only the head 
    Y #= X - 2 ; Y #= X - 3. 
change([X|Xs], [X|Ys]) :- % Keep the head and change something later 
    change(Xs, Ys). 

Das mögliche Problem mit dieser Lösung ist, dass es change(L, L). wahr ist (die Liste wird nicht geändert). Um dies zu vermeiden, können Sie den Basisfall für die Einzelelementliste ändern und die anderen zu zwei Elementen zwingen:

change([X], [Y]) :-    % Change only the last or single element 
    Y #= X - 2 ; Y #= X - 3. 
change([X,X1|Xs], [Y,X1|Xs]) :- % Change only the head 
    Y #= X - 2 ; Y #= X - 3. 
change([X,X1|Xs], [X,Y1|Ys]) :- % Keep the head and change something later 
    change([X1|Xs], [Y1|Ys]). 
+0

Ist dies eine übliche Lösung, um dieses Problem zu vermeiden; durch Hinzufügen des zusätzlichen Elements? \ – user3667111

+0

@ user3667111 Das Hinzufügen des zusätzlichen Elements ist eine Möglichkeit, um zwei oder mehr Elemente in der Listenlogik zu erzwingen. Ich möchte nicht, dass die zweite oder dritte Klausel einer einzelnen Elementliste entspricht. Ich möchte nur, dass die erste Klausel einer einzelnen Elementliste entspricht. – lurker

+0

Okay, danke. Auch ich weiß, dass dies trivial sein kann, aber warum setzen Sie das '(Y ist X - 2; Y ist X - 3)' in Klammern? – user3667111

Verwandte Themen