2016-09-14 1 views
1

In der Vorlesung ging es um Betreiber und deren Priorität. Während die Aufgabe auf einem Anfängerniveau ist, habe ich Schwierigkeiten, meinen Kopf herumzulegen, wo man sogar die Logik findet.Wechsel der Operatoren in Prolog

Die Aufgabe ist Betreiber mit einem erfüllt/2 Prädikat zu ändern:

?- met(q+w+e,Y).  
Y=q-w-e. 

?- met(q-w-e,Y). 
Y=q+w+e. 

ich nichts dagegen, wenn Leute mir den richtigen Weg schubsen oder die Antwort straightout geben. Ich habe das jetzt eine Weile gegoogelt und nichts gefunden. Ich habe versucht, wenn - dann, aber es hat nicht funktioniert.

Vielen Dank im Voraus!

Antwort

3

Jeder Prolog-Ausdruck kann als Baum dargestellt werden. Zum Beispiel für den Begriff q+w+e, und unter der Annahme der Standard-Bedien Definition für den Infixoperator (+)/2 haben wir:

?- write_canonical(q+w+e). 
+(+(q,w),e) 
true. 

Nun, wenn Sie einen Baum haben, können Sie Traverse es und tun, um die Transformation Sie benötigen jeder Nicht-Blatt-Knoten. Eine Teil Lösung:

met('+'(Left, Right), '-'(TLeft, TRight)) :- 
    met(Left, TLeft), 
    met(Right, TRight). 
+0

Nur ein sehr kleiner Zusatz zu dieser guten Antwort für OP: Wir können ohne Apostrophe die Klausel Kopf schreiben, wie 'traf (+ (links, rechts), - (Tleft, Tright)): - ... ', und mit Hilfe von Infix-Operatoren:' met (Links + Rechts, TLeft-TRight): - ... '. Dies sind äquivalente Bezeichnungen für die gleichen Begriffe. – mat

+0

Operator Notation ist praktisch und, wenn Sie mit Standardoperatoren arbeiten, normalerweise sicher. Auf der anderen Seite kann die Vermeidung von Abhängigkeiten von den Besonderheiten von Operatordeklarationen * und * den Macken von Prolog-Parsern zu robusterem und portablem Code führen. Aber oben wurde nur betont, dass die Operatoren nur Syntaxzucker sind. –