2017-01-13 5 views
1

Grundsätzlich möchte ich die ersten N Zahlen aus einer Liste entfernen, die Funktion, die überprüft, ob eine Zahl ist prime oder nicht scheint gut zu funktionieren, aber das Programm selbst nichtLöschen ersten N Primzahlen aus einer Liste (Prolog)

Zum Beispiel für den Eingang [2,4,5,7,6,9,11] und N = 3 sollte ich [4, 6, 9, 11] bekommen, aber ich bekomme nur [4, 6, 9].

divisible(X,Y) :- 
    0 is X mod Y, !. 
divisible(X,Y) :- 
    X > Y+1, 
    divisible(X, Y+1). 

%isPrime function check whether or not the argument is a prime number 
isPrime(2) :- true,!. 
isPrime(X) :- X < 2,!,false. 
isPrime(X) :- not(divisible(X, 2)). 

%delFunction (input_list, N, output_list) 
delFunction([],_,_). 
delFunction(_,0,_). 
delFunction([H|T], N, [H|Res]):- 
    not(isPrime(H)), !, 
    delFunction(T, N, Res). 
delFunction([_|T], N, Res):- 
    N1 is N-1, 
    delFunction(T,N1,Res). 

delFunction([2,4,5,7,6,9,11],3,X) ->[4,6,9] (was nicht die richtige Antwort)

Ehrlich gesagt, ich weiß nicht, wo ich schief gelaufen ist, scheint die Umsetzung Idee ist ziemlich einfach und geradlinig, so ist der Code.

Auch, wenn ich es starte es stoppt bei 10 und ich muss weiter klicken, um mich bis zum Ende der Ausführung (also das Ergebnis) zu bekommen. Irgendeine Idee, wie man es repariert? Ich denke, vielleicht brauche ich ein paar Schnitte, bin mir aber nicht sicher, wo.

PS: Ich möchte lieber nicht über integrierte Funktionen verwenden (wenn es welche gibt, die in diesem Szenario würde helfen)

+0

Ja, nun, das sind meine Probleme. Die fertige Ausgabe ist nicht richtig und es gibt mir mehrere Antworten (wenn es nur einen geben soll, natürlich). Denken Sie immer noch, es ist ein Missbrauch von! irgendwo ... – Hansewl

Antwort

2

Fists of all, statt

delFunction([],_,_). 

sollten Sie schreiben

delFunction([],_,[]). 

Wenn die Eingabeliste (die linke) leer ist, müssen Sie die Basis für die Ausgabeliste erstellen: eine leere Liste; Mit delFunction([], _, _) vereinheitlichen Sie die Ausgabeliste nicht mit der leeren Liste, so dass das Ergebnis mit einer nicht vereinheitlichten Variable endet.

Sekunde. Statt

delFunction(_,0,_). 

sollten Sie

delFunction(L,0,L). 

Das Problem ist das gleiche schreiben: Wenn Zahl Null ist möglich „Kopie“ der Eingang in der Ausgabe; das heißt, Sie können sie vereinigen; das ist delFunction(L,0,L). Mit delFunction(_,0,_) vereinheitlichen Sie nicht und das Ergebnis endet mit einer nicht einheitlichen Variable.

Dritte. In der IS-prime-Klausel

delFunction([_|T], N, Res):- 
    N1 is N-1, 
    delFunction(T,N1,Res). 

sollten Sie überprüfen, dass N größer als Null ist

delFunction([_|T], N, Res):- 
    N > 0, 
    N1 is N-1, 
    delFunction(T,N1,Res). 

oder, wenn Sie es vorziehen, sollten Sie einen Schnitt (!) in der Null Klausel hinzufügen

delFunction(L,0,L) :- !. 

Um zu vermeiden, dass Prolog über Backtracking mehrere unerwünschte Antworten geben kann.

--- EDIT ---

Als Guy Coder, ich vermeiden Schnitte wie eine Plage; Daher schlage ich folgende Lösung vor, um unerwünschte Wiederholungen zu vermeiden.

delFunction([], _, []). 

delFunction([H | T], 0, [H | T]). 

delFunction([H | T], N, [H | Res]) :- 
    N > 0, 
    not(isPrime(H)), 
    delFunction(T, N, Res). 

delFunction([H | T], N, Res):- 
    N > 0, 
    isPrime(H), 
    N1 is N-1, 
    delFunction(T, N1, Res). 
+0

@GuyCoder - mit Wich Anruf? Mit 'delFunction ([2,4,5,7,6,9,11], 3, X)'? – max66

+0

Dank Mann, wirklich geholfen, es funktioniert jetzt und gibt nur 1 Antwort. – Hansewl

+0

@GuiCoder - mit swi-prolog ich nur eine Antwort, aber mit gprolog I 3. bekommen Es ist die 'N> 0 'che vor' nicht (isPrime()) ' – max66

Verwandte Themen