Ich erkannte gerade, dass das eine dumme Frage war. Neugierig, wenn noch jemand eine Lücke finden kann.Wie man Rekursion nach einmaligem Looping verhindert
Quellcode:
married(trump,obama).
married(trump,goat).
married(pepee,pepper).
married(X,Y) :- married(Y,X),!. % not awesome because of infinite recursion
Goal: ex. married(trump, putin).
trace(
first base case fails.
second base case fails.
third base case fails.
married(trump,putin) = married(putin,trump),!.
, was ich will ist verheiratet (putin, Trumpf) versuchen dabei wieder, aber alle früheren Basis Fällen wird wieder scheitern. Wir haben vorher versucht, die Argumente zu wechseln und sind gescheitert. Also rekrutiere nicht. Gib einfach falsch zurück.
Ich bekomme einen Stapelfehler, weil bis verheiratet (Putin, Trumpf) oder anders herum vorher! wird nie wahr oder falsch zurückgeben, so dass der Schnitt nicht ausgelöst werden kann.
Einfacher und vernünftiger Weg ist es, nur den Code neu zu schreiben, um Rekursion zu verhindern. Ich bin gespannt, ob es einen Weg gibt, die Argumente einmal zu wechseln und scheitern zu lassen, wenn das fehlschlägt. Wenn Sie eine lange Liste von Fakten haben, können Sie diese lange Liste um die Hälfte reduzieren, wenn Sie arg1, arg2 und umgekehrt versuchen können. Potenziell exponentiell, wenn wir verrückte Permutationsszenarien bekommen.
Alle Einblicke werden fantastisch sein, danke.
Sind diese alternativen Fakten? – false