2 Prädikate in Regel,die sich bei jedem Durchlauf ändern

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

  • 2 Prädikate in Regel,die sich bei jedem Durchlauf ändern

    Hallo,

    mit dem Forumwechsel und weil sich meine Erkenntnis bezüglich meines Problems geändert haben, poste ich das Ganze nochmal in nem neuen Thread.

    Im Prinzip läuft mein Problem darauf hinaus, daß ich 2 Prädikate in einer Regel habe,die bei jedem Durchlauf geändert werden sollen. Also ungefähr so (beispielhaft):
    [code:1]

    zahl(1).
    zahl(X):- zahl(Y), X is Y+1.

    id(1).
    id(X):- id(Y), X is Y+1.

    echo:- zahl(X), id(Y).

    [/code:1]

    Und dann sollen beide Zähler gleichzeitig hochgezählt werden, ungefähr so: X= 1 Y=1, X=2 Y=2 usw. Aber genau da liegt der Hase im Pfeffer.
    Denn er schafft ja den ersten Teil der echo-Regel mit 1 zu erfüllen und auch den zweiten Teil mit 1. Aber dann müßte er Backtracking machen, um den ersten Zähler um 1 zu inkrementieren, nur macht er das Backtracking nur im zweiten Teil der Regel. Und das ist ja auch vollkommen korrekt. Er macht das Backtracking im 2. Teil der Regel und stößt auf die nächste gültige Lösung. Und das geht so weiter, weshallb er dann in ner "Endlosschleife" landet.
    Also müßte man ihm irgendwie beibringen, das Backtracking nicht nur auf den 2. Teil, sondern auf die ganze Regel anzuwenden.

    tom_paris78
  • Hallo erstmal,...

    ich muss zugeben mich nicht mehr 100% in der Materie Prolog zu befinden, dennoch würde ich mal 2 möglichkeiten in den Raum werfen.

    Ich weiß allerdings auchnicht genau was du zum schluss mit deinen Regeln bestimmen willst aber vielleicht gehts entweder mit Rekursion oder mit den Not und Cut anweisungen, beides im Prolog Arbeitsbuch bei Prolog Literatur zu finden.


    Hoffe ich konnte dir zumindest einen ansatz bieten :)
    mfg KC
  • Hi,

    wenn ich dich richtig verstanden habe, und du nur zwei unabhängige Zähler in einer Regel um 1 erhöhen willst, sollte dies funktionieren (ungetestet):

    [code:1]
    succ(N, SuccN) :- SuccN is N + 1.

    inc(X, Y, SuccX, SuccY) :- succ(X, SuccX), succ(Y, SuccY).
    [/code:1]

    Die Regel inc nimmt die beiden Zähler X und Y entgegen und gibt deren Nachfolger SuccX und SuccY zurück.

    Viele Grüße,

    Siracusa