2010-06-03 7 views
9

Der Pipe-Operator in Prolog gibt einen oder mehrere atomare Heads und eine Tail-Liste zurück.Was bewertet [a | b | c] in SWI-Prolog?

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

Was bedeutet die Aussage infer [a|b|c] über a, b und c:

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

Nesting mehrere Rohre in einem Einzelspiel kann ähnlich wie dies geschehen?

EDIT

Bisher alles, was ich ableiten kann, ist:

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

Ich bin mehr daran interessiert, in irgendwelchen Techniken die Antwort zu finden, anstatt diese Grenze nutzlos Frage zu beantworten.

EDIT2
ich mit Prolog eindeutig nicht allzu vertraut bin, eine einfache Zuordnung meiner Frage ...

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

beantwortete Was genau mit (b'|'c) los?

+1

Sieht aus wie Hausaufgaben für mich. Wenn ja, bitte markieren Sie es als das. –

+3

Ich bin nicht vertraut mit Prolog, aber, uhh, warum können Sie nicht einfach ein schnelles Programm schreiben, um es zu bewerten? – Matchu

+3

Eigentlich keine, nur eine interessante Frage, die ich während des Studiums für meine Semesterprüfungen bei uni: https://secure.csse.uwa.edu.au/run/help3242?p=np&a=99 stolperte Ich habe eine Weile verbringen bekommen meine Frage, um gut auszusehen, fit für eine Prüfungsarbeit? :) – Ambrose

Antwort

9

Da ich m Ihr Dozent I, hier ist meine Antwort.
(Oh, und ich kann bestätigen, dass dies keine Hausaufgaben sind, es hängt mit der Übungsprüfung zusammen).

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

Manche interpretieren es als [a|[b|c]]. (Wie ich gedacht.)

Aber mit SWI Prolog (und wahrscheinlich noch andere):

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

Die (b '|' c) ist tatsächlich gebaut mit '|' statt '.' als eine Liste wäre.Also, die zweite | wird nicht als Teil der Erstellung einer Liste überhaupt interpretiert.

Um dies zu bestätigen, folgendes folgt:

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

Die '|' hier scheint wie '.' nur eine andere Binäroperators zu Bedingungen zu sein.

Anstelle von [a|b|c] ist der Standard in Prolog [a,b|c] zu verwenden.

(I entschied nur [a|b|c] in Programmierparadigmen zu verwenden, da es [a,b|c] bezieht sich direkt auf die Notation a::b::c von F #, und wir sahen nur einen kleinen Einblick in Prolog. In Zukunft denke ich, dass ich auf [a|[b|c]] beziehen werde und dann geben als Abkürzung.)

+0

Oh, richtig! Also ist [a | b | c] 'syntaktischer Zucker für' '.' (A, (b '|' c)) '!Also unterscheidet sich der '|' Operator von '::' darin, dass der Tail nicht unbedingt eine Liste sein muss, nur ein "Ding"? Ich versuche immer noch zu schlucken was genau es bedeutet für eine Sprache ** Typen ** zu haben ... – Ambrose

+1

Technisch sind das '.'' und das' '|' 'die Operatoren. Beide können auf beliebige zwei Terme angewendet werden, um ein Paar zu erzeugen - im Gegensatz zu '::' in F #/ML, wo der Typ-Checker sicherstellt, dass '::' nur für Paare eines Kopfes und eines entsprechenden Tails verwendet wird. '' .'' wird fast immer für Listen verwendet, und die Syntax '[t1, t2 | t3] 'ist eine Abkürzung für' '.' (t1, '.' (t2, t3)) '. Wenn 't3' eigentlich' t4 | t5 'dann, dass' | 'nicht Teil der Abkürzung ist, so erhalten Sie' '.' (t1, '.' (t2, (t4 '|' t5))) '. – RD1

+1

Welches System interpretierte '[a | b | c]' als '[a | [b | c]'? Bitte sehen Sie meine Antwort für den Standard. – false

5

Es ist keine Aussage, es ist ein Begriff, und es bedeutet überhaupt nichts über a, b oder c. Es erstellt nur eine falsche Liste.

Um zu erarbeiten: Die [|] Syntax ist eigentlich syntaktischer Zucker für den .() Operator. Listen werden intern über '.'(a,[]) erstellt, aber da es sehr mühsam ist, sofort zu schreiben, können Sie stattdessen [a] schreiben. Der Operator . soll also ein Ding und eine Liste nehmen und dann eine längere Liste erstellen, aber da es keine Eingabe gibt, verhindert niemand, dass Sie sie auf zwei Atome oder ein anderes Paar Dinge anwenden. Das Ergebnis ist eine Struktur, bei der einige Listenvorgänge erfolgreich sind und andere fehlschlagen. Dies ist manchmal nützlich (denke Binärbäume), aber nicht so häufig wie Listen, daher gibt es keine spezielle Lesesyntax dafür.

(Ähnliches geschieht mit dem cons Operator in Lisp;., Wenn Sie „falsche Liste“ google Sie haften viele weitere Ergebnisse über Lisp zu bekommen, aber das Prinzip ist genau das gleiche)

+0

Große Antwort, danke! Du könntest mir einen Hinweis auf meine zweite Bearbeitung der Frage geben, mit '' | ''? – Ambrose

+0

Ja, außer dass in SWI Prolog (und wahrscheinlich anderen) das zweite '|' wird nicht als "." interpretiert. – RD1

5

In ISO-Prolog ist [a|b|c] 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 Interpretation. Leider unterschieden sich alle sehr genau darin, wie sie diesen Begriff interpretierten. Einige als [(a'|'b)|c] oder [a|(b'|'c)] oder [a|(b;c)] ... nun, Sie bekommen es.

Damit verbunden ist die Verwendung der Bar als Infix-Operator ('|')/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. Zuvor musste | zitiert werden. Hier is its draft.

Nun '|' kann als Infixoperator definiert werden, sondern nur mit einer Priorität über 1000. Auf diese Weise sonst eindeutige Fälle als [a|b|c] syntaktisch ungültig bleiben, nutzt aber von | für DCGs und CHR gilt. Wenn Sie die Syntax durch Ausprobieren lernen möchten, verwenden Sie am besten writeq/1 und write_canonical/1.

Das am meisten konforme System w.r.t ISO-Prolog Syntax ist GNU Prolog.