Aufgaben Logische Programmierung
Aufgaben Logische Programmierung
Aufgaben Logische Programmierung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
?- [a21_ausdruck, a22_wertetabelle].<br />
Aufgabe 23 Plus-Minus-Terme<br />
Dateiname: a23_plusminus.pl<br />
In dieser Aufgabe betrachten wir Ausdrücke, die aus Zahlen mit Hilfe von + und − und Klammern<br />
gebildet sind, z.B. den Ausdruck 8 − (2 + 3). Die übliche Darstellung eines solchen Ausdrucks,<br />
z.B. 8-(2+3) stellt zugleich einen Term in Prolog dar. Wir wollen einen solchen Term einen Plus-<br />
Minus-Term nennen. Wir wollen aber noch eine alternative Darstellung eines solchen Ausdrucks<br />
als Prologterm betrachten. Dazu definieren wir induktiv den Begriff „add-sub-Term“. add-sub-<br />
Terme sind spezielle Prologterme. Hier die induktive Definition:<br />
1. Für jede Zahl z ist der Prologterm zahl(z) ein add-sub-Term.<br />
2. Wenn t1 und t2 zwei add-sub-Terme sind, dann sind auch add(t1,t2) und sub(t1,t2) addsub-Terme.<br />
Jeder Plus-Minus-Term hat auch eine Darstellung als add-sub-Term und umgekehrt. Z.B. entspricht<br />
dem Plus-Minus-Term 8-(2+3) der add-sub-Term sub(zahl(8),add(zahl(2),zahl(3))).<br />
Stellen wir uns nun vor, wir haben bereits ein Programm, das mit dieser Darstellung arbeitet,<br />
aber auch ein von jemand anderem geschriebenes Programm mit ähnlicher Darstellung, nur dass<br />
die Funktoren anders benannt sind: sum statt add, dif statt sub und num statt zahl. Analog wie<br />
oben definieren wir: sum-dif-Terme sind spezielle Prologterme. Hier die induktive Definition:<br />
1. Für jede Zahl z ist der Prologterm num(z) ein sum-dif-Term.<br />
2. Wenn t1 und t2 zwei sum-dif-Terme sind, dann sind auch sum(t1,t2) und dif(t1,t2) sumdif-Terme.<br />
Jeder Plus-Minus-Term hat auch eine Darstellung als sum-dif-Term und umgekehrt. Z.B. entspricht<br />
dem Plus-Minus-Term 8-(2+3) der sum-dif-Term dif(num(8),sum(num(2),num(3))).<br />
Wir wollen beide Programme in einem größeren Softwaresystem verwenden und benötigen daher<br />
Prädikate zur Übersetzung von einer Darstellung in die andere. Definieren Sie dazu<br />
1. ein Prologprädikat addsub_sumdif/2 zur Übersetzung eines add-sub-Terms in einen sumdif-Term<br />
und umgekehrt! Z.B. sollte gelten<br />
addsub_sumdif(sub(zahl(8),add(zahl(2),zahl(3))),<br />
dif(num(8),sum(num(2),num(3))))<br />
2. ein Prologprädikat addsub_plusminus/2 zur Übersetzung eines add-sub-Terms in einen<br />
Plus-Minus-Term! Beispiel:<br />
?- addsub_plusminus(sub(zahl(8),add(zahl(2),zahl(3))), Plusminusterm).<br />
Plusminusterm = 8-(2+3)<br />
3. ein Prologprädikat plusminus_addsub/2 zur Übersetzung eines Plus-Minus-Terms in einen<br />
add-sub-Term! Beispiel:<br />
?- plusminus_addsub(8-(2+3), Addsubterm).<br />
Addsubterm = sub(zahl(8),add(zahl(2),zahl(3)))<br />
Hinweis: Schauen Sie sich die Dokumentation des Prolog-Prädikats number/1 an! Probieren<br />
Sie es auch aus mit Anfragen wie<br />
?- number(5).<br />
?- number(2+3).<br />
14