[PROLOG] Arithmetische Ausdrücke als Grammatik einlesen

  • Hallo,

    habe da ein Problem mit folgender Aufgabenstellung, folgende Grammatik soll in Prolog programmiert werden:

    (1)Ausdruck--> Term | Term + Ausdruck | Term - Ausdruck
    (2)Term --> Faktor | Faktor + Term | Faktor / Term
    (3)Faktor --> a | b | c | (Ausdruck

    Folgendes habe ich schon geschrieben:

    Beim Testen mit:

    ausdruck(a*(b-c)).

    meldet er: Out of local stack.

    Ich muss also einen Rekursionsabbruch einbauen und die Rekursion terminieren, oder?
    Ich komm leider nicht drauf, an welcher Stelle ich den einbauen muss...hab schon alles mögliche probiert.

    Danke im Voraus :)
    PaddyG

  • Das liegt daran:
    ausdruck(X) :- term(X).
    Dann geht er zu:
    term(X) :- faktor(X).
    Dann:
    faktor(X) :- ausdruck(X).
    - und wir landen wieder am Anfang!
    Du kannst es einmal hiermit probieren:

    Code
    faktor(X) :- ausdruck(X), !.


    (! ist immer das Allheilmittel bei so Endlosschleifen, das dann doch nicht alles heilt. ;) Aber probieren geht über s tudieren!)
    Ansonsten versuch das Programm so umzustrukturieren, dass die Rekursion nicht mit der unverkürzten, sondern immer mit eine verkürzten Liste stattfindet, dann wird er zum Ender kommen, wenn die Liste leer ist, garantiert.
    Du hast ja auch einen Rekursionsabbruch, mit term(X) :- faktor(X).
    Der tritt nur nicht ein, da er immer wieder mit der selben Liste aufgerufen wird.
    Wenn es mit dem ! erst nicht funktioniert, dann such mal eine andere Endlosschleife, wo immer wieder das selbe aufgerufen wird.

    Viele liebe Grüße
    The User