"nicht" - operator oder der negation in Prolog
Hintergrund
Schreiben brauche ich eine relation von Leistung(P) , sieht durch die Liste und entscheidet, ob alle, aber ein element von P ist null.
Hier ist was ich habe:
%I have a relation called zero(P) which decides if every element is zero.
power([H|T]) :- H is not zero, %The current element is non zero, the tail is all zero.
zero(T).
power([0|T]) :- power(T). %The current element is zero,
%but the tail has a non zero element in it.
Einige Ressourcen empfehlen die Verwendung der cut-operator (!), die Kontrollen backtracking, und ich glaube nicht, dass das ist, was ich Suche.
Habe ich auch in die nicht beweisbare-operator (\+), das scheint zu vertauschen, das Ergebnis (ist nicht beweisbar ist gibt ja), und ich glaube nicht, dass das, was ich will.
Ich fand die Prolog Wörterbuch, aber ich kann nicht herausfinden, was "nicht" bedeutet oder wie es zu benutzen (wie Sie sich vorstellen können, Strg+F findet viele Instanzen von " nicht ").
Frage
Wie kann ich sagen 'H ist nicht null' im prolog?
BEARBEITEN Die Liste ist eine Liste von Ganzzahlen.
InformationsquelleAutor jessicaraygun | 2013-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, Ihr argument ist eine Liste von zahlen, können Sie einfach arithmetische Operatoren:
Im Allgemeinen, Sie können auch schreiben
\+ (H=0)
. Das bedeutet,H
können nicht vereint sein mit0
.Die Frage ist, was Sie wollen passieren, wenn dieses Prädikat ist mit einer Liste nicht eine Liste von zahlen. Der obige code würde einen Fehler verursachen. Wenn Sie es wollen, nur nicht in solchen Fällen, dann kann es definiert werden als
du bist herzlich willkommen. 🙂
InformationsquelleAutor Will Ness
Funktionierende Lösung unter Verwendung von 'nicht beweisbar' - operator:
zero(H)
genannt wird, mit einer Zahl, sondern erwartet eine Liste. 🙂Empfehlen Sie
power([H|T]):- \+ zero([H]), zero(T).
statt? Es scheint, dass die null-relation akzeptiert eine Reihe anstelle einer Liste als gut, und das funktioniert auch.Nevermind,
zero(T)
nimmt immer den Schwanz ein-Liste ist immer eine Liste (auch wenn es die leere Liste). Mein Fehler.InformationsquelleAutor jessicaraygun
null/1 scheint eine eher spezialisierte Prädikat. Wenn Sie möchten erfahren mehr idiomatische (erweiterte?) Prolog, betrachten wir ein 'one-liner' - definition basierend auf der Bibliothek(bewerben):
test:
Natürlich, ich kann mir nicht vorstellen, warum Sie benannt Prädikat "power"...
Der Prolog ist ein wenig behindert durch seine langen Erbe (es ist fast eine C-contemporary), und von Implementierungen' Divergenz. Es ist etwas Aufwand geht, um Anfängern zu helfen, aber ich denke, dass StackOverflow Ansatz ist es besser schon jetzt zu haben. Ich dachte, der Integration von Ressourcen, die von SO in eine kleine IDE, die ich arbeite, zu integrieren, die gute SWI-Prolog Dokumentation mit einigen use-cases.
Ich vollkommen verstehen, die Schwierigkeiten. Der SWI-Prolog-Dokumentation ist in der Tat sehr gut. Dennoch, angesichts der Menge an Arbeit, die Jan Wielemaker und anderen setzen in der Umsetzung, es ist fast traurig, dass es nicht ein anständiges tutorial dafür (nicht auf Prolog im Allgemeinen, oder logische Programmierung: einfach auf die SWI-Umsetzung). Sie und einige andere bieten eine unschätzbare Hilfe für newcommers hier SO, aber leider ist vieles davon wieder rückgängig gemacht, indem die knuckle-headed Ansatz Prolog Lehre an den meisten Universitäten.
Als kleines Beispiel, die Lösung zu OP ' s ursprüngliche problem, dass Sie vorgeschlagen, ist wohl als unakzeptabel. Der professor zitieren didaktischen Gründen, und das ist einfach nur albern.
Ich nannte das Prädikat macht, weil die Liste ist eine Liste von Koeffizienten repräsentiert ein Polynom, z.B. 1 + x + 4x^2 + 5x^3 ist vertreten durch [1,1,4,5]. Ich muss eine einfache Potenz von x, d.h. nur eines der Elemente in der Liste nicht null ist. Ich wusste nicht erklären, dass ein Teil, weil meine Frage war viel einfacher als das. Vielen Dank für Ihre effiziente Lösung, ich werde schauen in den link, den Sie zur Verfügung gestellt.
InformationsquelleAutor CapelliC