Frage

Der Rohroperator im Prolog gibt einen oder mehrere Atomköpfe und eine Schwanzliste zurück.

?- [a,b,c] = [a,b|[c]].
true.

Das Nisten mehrerer Rohre in einer einzigen Übereinstimmung kann folgendermaßen ähnlich erfolgen:

?- [a,b,c] = [a|[b|[c]]].
true.

Was macht die Aussage [a|b|c] Schließen Sie auf A, B und C?

BEARBEITEN

Bisher kann ich nur schließen ist:

?- [a,b,c] = [a|b|c].
false.

Ich interessiere mich mehr für jeden Techniken Um die Antwort zu finden, anstatt diese nutzlose Frage der Grenze zu beantworten.

Edit2
Ich bin eindeutig nicht allzu vertraut mit Prolog, eine einfache Aufgabe beantwortete meine Frage ...

?- R = [a|b|c].
R = [a| (b'|'c)].

Was genau ist los (b'|'c)?

War es hilfreich?

Lösung

Da ich dein Dozent bin, bin ich hier meine Antwort.
(Oh, und ich kann bestätigen, dass dies keine Hausaufgaben, sondern mit der Praxisprüfung zusammenhängt).

Die Syntax [a|b|c] Eigentlich scheint es nicht Standard -Prolog zu sein, und einige Implementierungen interpretieren es anders. (Hätte ich das gewusst, dass ich es vielleicht nicht benutzt hätte.)

Einige interpretieren es als [a|[b|c]]. (Wie ich beabsichtigte.)

Aber mit Swi Prolog (und wahrscheinlich anderen):

?- [a|b|c] = [a|[b|c]].
false.

Das (b '|' c) wird tatsächlich mit Verwendung konstruiert '|' statt '.' wie eine Liste wäre. Also die zweite | wird nicht als Teil des Konstruktion einer Liste interpretiert.

Um dies zu bestätigen, ist der folgende Erfolg:

   ?- X=(b|c), [a|b|c] = [a|X].
   X = (b'|'c) .

Das '|' Hier scheint ein weiterer binärer Betreiber zu Begriffen zu sein '.'.

Anstatt von [a|b|c] Der Standard im Prolog ist zu verwenden [a,b|c].

(Ich habe mich nur entschlossen zu verwenden [a|b|c] Bei der Programmierung von Paradigmen, weil es sich direkter auf die Notation bezieht a::b::c Von F#, und wir sahen nur einen winzigen Blick auf Prolog. In Zukunft werde ich mich wohl beziehen [a|[b|c]] und dann gib [a,b|c] als Abkürzung.)

Andere Tipps

Es ist keine Aussage, es ist ein Begriff, und es bedeutet überhaupt nichts darüber a, b oder c. Es erstellt nur eine unsachgemäße Liste.

Zu erläutern: die [|] Syntax ist tatsächlich syntaktischer Zucker für die .() Operator. Listen werden intern durch konstruiert '.'(a,[]), Aber da das äußerst mühsam wird, sofort zu tippen, dürfen Sie schreiben [a] stattdessen. Also die . Der Bediener soll etwas und eine Liste nehmen und dann eine längere Liste erfährt, aber da es kein Tippen gibt, verhindert niemand, dass Sie sie auf zwei Atome oder ein anderes Paar von Dingen anwenden. Das Ergebnis ist eine Struktur, auf der einige Listenvorgänge erfolgreich sind und andere scheitern. Dies ist manchmal nützlich (denken Sie an binäre Bäume), aber nicht so häufig wie Listen. Daher gibt es keine spezielle Lesesyntax dafür.

(Ähnliches passiert mit dem cons Operator in Lisp; Wenn Sie "Insachliche Liste" googeln, können Sie viele weitere Ergebnisse über LISP erzielen, aber das Prinzip ist genau das gleiche.)

Innerhalb des Iso-Prologs, [a|b|c] ist ungültige Syntax. Und in der Zwischenzeit auch innerhalb von SWI. Es scheint, dass Sie eine ältere Version verwendet haben. Einige Prolog -Systeme gaben diesem Begriff eine gewisse Interpretation. Leider unterschieden sich alle genau wie sie diesen Begriff interpretierten. Einige wie [(a'|'b)|c] oder [a|(b'|'c)] oder [a|(b;c)] ... Nun, du verstehst es.

Im Zusammenhang damit ist die Verwendung der Stange als Infixbetreiber ('|')/2.

Mit ISO/IEC 13211-1: 1995/cor.2: 2012, Technical Corrigendum 2, veröffentlicht 2012-02-15 Die Verwendung von Bar | Als Infix -Operator ist jetzt genau definiert. Vorher, | musste zitiert werden. Hier ist sein Entwurf.

Jetzt, '|' kann als Infixbetreiber definiert werden, jedoch nur mit einer Priorität über 1000. auf diese Weise ansonsten mehrdeutige Fälle als [a|b|c] bleiben syntaktisch ungültig, aber verwendet von | Für DCGs und CHR sind gültig.

Wenn Sie Syntax lernen möchten, indem Sie sie ausprobieren, ist das Beste zu verwenden writeq/1 und write_canonical/1.

Das ansprechendste System-WRT-ISO-Prolog-Syntax ist GNU Prolog.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top