2016-11-25 5 views
1

Ich möchte ein Programm schreiben, das jedes Nth Element aus einer Liste ohne die letzte löscht. Mein Programm funktioniert bereits und gibt mir das richtige Ergebnis, aber wenn ich nach einem anderen Ergebnis frage, kommt prolog mit dem Fehler ">/2: Argumente sind nicht ausreichend instanziiert". Hier ist der Code, den ich bisher habe:Löschen Sie alle N Elemente aus der Liste

delete_elements([],0,[]). 
delete_elements([],_,[_|_]). 
delete_elements(L,N,R) :- 
    length(L,LL), 
    LL > N, 
    nth1(N,L,_,RZ), 
    NZ is N + 1, 
    delete_elements(RZ,NZ,RR), 
    R = RR. 
delete_elements(L,N,R) :- 
    length(L,LL), 
    LL =< N, 
    delete_elements([],_,R), 
    L = R. 

Ich denke, dass es etwas falsch mit der Abbruchbedingung der Rekursion ist. Wie behebe ich das?

Vielen Dank im Voraus!

Antwort

1

Das Problem ist in der Klausel:

delete_elements(L,N,R) :- 
    length(L,LL), 
    LL =< N, 
    delete_elements([],_,R), 
    L = R. 

Sie haben Ihre Arbeit beenden, aber Sie immer noch Ihr Prädikat mit einem anonymen Variable nennen statt N. könnten Sie schreiben einfach:

delete_elements(L,N,L) :- 
    length(L,LL), 
    LL =< N. 

Beispiel :

?- delete_elements([1,2,3,4,5,6,7,8,9,1,2,3],3,L). 
L = [1, 2, 4, 6, 8, 1, 3] ; 
false. 

Für das, was Sie in Ihrem Kommentar gefragt haben, wäre meine Implementierung:

delete_elements(L,N,R) :- delete_elements(L,1,N,R). 

delete_elements([],_,_,[]). 
delete_elements([X],N,N,[X]). 
delete_elements([X|Xs],N,N,Rs):- length([X|Xs],Y),Y>1,delete_elements(Xs,1,N,Rs). 
delete_elements([X|Xs],P,N,[X|Rs]):- P < N,P1 is P+1,delete_elements(Xs,P1,N,Rs). 
+0

Vielen Dank! Sie wissen, warum das Programm nur für N = 2 funktioniert? Wie man das Programm für jedes N (1,3 und so weiter) arbeiten lässt? – zer0kai

+1

Geben Sie ein Beispiel für die Eingabe gewünschte Ausgabe ... – coder

+0

Zum Beispiel wenn ich nach delete_elements ([1,2,3,4,5,6,7,8,9], 3, R) fragen, sollte der Ausgang R sein = [1,2,4,5,7,8,9], weil das letzte Element (9) in der Liste sein sollte. – zer0kai

Verwandte Themen