Ich schrieb dies als eine Möglichkeit Grenze Lösungen zu helfen, auch wenn es unendlich viele Lösungen. Aber ich erkannte, dass es eine Möglichkeit geben würde, die Regeln neu zu ordnen, um zuerst kürzere Ergebnisse zu erhalten.
Da ad --> a, ad, d.
vor ad --> bc.
ausgewertet wird versucht es ad --> a, ad, a.
vor ad --> bc.
gerecht zu werden. Ich würde ad --> bc.
vor ad --> a, ad, a.
setzen. Das gleiche gilt für die bc --> b, b, bc, c, c.
und bc --> [].
Regeln
Wie Arian wies darauf hin, die Abschlussregeln zuerst angewendet haben, würde sicherstellen, dass die kürzeren Lösungen zuerst gefunden werden.
Ich möchte auch darauf hinweisen, dass es zwei Lösungen für []
s und s -> ad -> bc -> [] Ich würde s --> [].
zu beseitigen, wie es redundant ist.
Alles in allem würde ich diese Lösung versuchen:
s --> ad.
a --> [a].
b --> [b].
c --> [c].
d --> [d].
ad --> bc.
bc --> [].
ad --> a, ad, d.
bc --> b, b, bc, c, c.
ORIGINAL POST:
Ich hatte bis zu schauen, wie das Zählen zu tun (es ist eine Weile her, seit ich Prolog tat) Aber es gibt eine unendliche Zahl und seit Prolog versucht, alle Lösungen zu finden, hört es nie auf zu suchen, obwohl ich sicher bin, dass du einen Stack über den Flow triffst oder einen Fehler davor hast :).
Eine Möglichkeit, die Anzahl der Ergebnisse zu begrenzen, ist die Größe der Lösung
phrase(s, X), length(X, 4).
Ruft alle Lösungen mit genau 4 Werte zu begrenzen, die
X = [a, a, d, d]
X = [b, b, c, c]
zuzunehmen 6 wäre ergäbe :
X = [a, a, a, d, d, d]
X = [a, b, b, c, c, d]
oder benutzen Bereiche:
Ich denke, wenn ich Ihre Frage verstanden habe, ist es, weil es viele Bäume gibt, die erstellt werden können, da es Schleifen in Ihrer Grammatik gibt – Muggen
Und wie soll ich dieses Problem beheben? : -? – Simon