Ich versuche einige wechselseitig rekursive Bedingungen mit SWI-Prolog zu lösen. Diese Einschränkungen sind relativ einfach, aber die Abfrage jeder dieser Prädikate führt zu unendlicher Rekursion:Lösen von gegenseitig rekursiven Bedingungen in Prolog
%If X is an animal, then X is a bird or a mammal, and vice-versa.
animal(X) :-
(mammal(X);bird(X)),
(male(X);female(X)).
male(X) :- animal(X).
female(X) :- animal(X).
bird(X) :- (X='parrot';X='pigeon'),animal(X).
mammal(X) :- (X='cat';X='dog'),animal(X).
Wäre es möglich, diese Einschränkungen in Prolog zu lösen, ohne sie zu nicht-rekursive zu machen?
Ich schrieb ein ähnliches Programm mit mehreren Basis Fällen, aber die Abfrage mammal(X),bird(X)
führt immer noch zu unendliche Rekursion statt false
der Rückkehr:
%If X is an animal, then X is a bird or a mammal, and vice-versa.
animal(X) :-
(mammal(X);bird(X)).
bird('parrot').
bird('pigeon').
bird(X) :- (X='parrot';X='pigeon'),animal(X).
mammal('cat').
mammal('dog').
mammal(X) :- (X='cat';X='dog'),animal(X).
Sie erkennen, dass Prologs Prädikate nicht zurück Werte wie Funktionen tun, oder? Also 'diff (Säugetier (X), Vogel (X))' tut nicht, was Sie wahrscheinlich denken, dass es tut. In der Tat wird es * immer * gelingen, da die Ausdrücke 'Säugetier (X)' und 'Vogel (X)' immer notwendigerweise unterschiedlich für jedes 'X' sind. Wie Scott in seiner "Antwort" betont, haben Sie keine Fakten oder Basisfälle. – lurker
@lurker Ja, die "dif/2" Prädikate waren in diesem Fall überflüssig. Ich habe das Programm bearbeitet, um dieses Problem zu beheben. –
Sie waren nicht nur überflüssig. Sie wurden fälschlicherweise verwendet. : p Ihre bestehende Logik, neben den fehlenden Basisfällen, wie Scott darauf hinweist, ist zirkulär. "Tier/1" ist definiert als "männlich/1", "weiblich/1" und "Säugetier/1". Und "männlich/1", "weiblich/1" und "Säugetier/1" sind in Bezug auf "Tier/1" definiert. – lurker