Prolog und Boolean-Funktionen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Prolog und Boolean-Funktionen

    Aloha allesamt,

    Ich stehe vor der Aufgabe, eine Wahrheitswerttabelle in Prolog einzufügen, sodass mir das Programm am Ende die möglichen Ergebnisse rauswirft. Ich hab allerdings keine Ahnung, wie das funktioniert und aus den Hilfen werd ich auch nicht schlauer. Meine Tabelle hat 3 Variablen und mein Ansatz sieht ca. so aus:

    Quellcode

    1. wahl1(1,1,_).
    2. wahl2(1,1,0).
    3. wahl3(0,_,1).
    4. wahl4(0,0,_).
    5. (wahlgesammt(A,B,C):-wahl1(A,B,C);wahl2(A,B,C);wahl3(A,B,C);wahl4(A,B,C).

    Die Aufgabenstellung lautet in etwa: Ein Gast kommt in eine Kneipe und sagt dem Wirt folgendes:

    1. Du musst mir jedes Mal Aquavit servieren, wenn du mir ein Bier bringst. (wahl 1)
    2. Schenkst du beides ein, dann wage nicht, mir zugleich Cognac anzubieten. (wahl 2)
    3. Trägst Du aber Cognac auf oder bringst du mir kein Bier, rate ich dir gut, mich mit Aquavit zu verschonen (wahl 3 und 4)

    (Im Programm sind dann Aquavit A, Bier B und Cognac C.)

    Letztendlich soll der Wirt bei jeder Bestellung (insg. 3) je eine verschiedene Kombi an Getränken servieren und diese Kombi muss ich rauskriegen.

    Also mal von Richtigkeit des Ganzen abgesehen, würd ich gern wissen, wie ich Boolean in Prolog einbaue.
  • Prolog ist ein einziges Booleankonstrukt. Man sollte immer im Hinterkopf behalten das Prolog nichts weiter als ein gigantischer Backtrackingalgorithmus ist. Prolog versucht immer anhand der Wissensbasis das sogenannte Ziel zur Erfüllen.

    Das ist also das erste, wir müssen das Ziel definieren, in unserem Fall ist das eine Belegung einer aussagenlogischen Formel. Hier mal ein ganz simpler Code um die Formel

    (a und b) oder c

    auszuwerten und die Ergebnisse aufzuschreiben:

    satisfy :- member(A,[0,1]),
    member(B,[0,1]),
    member(C,[0,1]),
    X is (A + B)*C,
    write((A oder B) und C = X),
    nl,
    fail.

    Das fail am ende sorgt lediglich dafür das er wieder zurückgeht und bei den member aufrufen C,B,A neu belegt (weil das Ziel ja gescheitert ist). Am ende stehen alle Kombinationen der Aussagenlogischen Formel da ;). Dieses Ding hat nur den Schönheitsfehler das wenn alle drei variablen 1 sind das 2 rauskommt, das könnte man natürlich abfangen.