Perché questo non funziona per definire "sposato" in Prolog?Come posso risolvere questo predicato circolare in Prolog?
married(X,Y):-married(Y,X).
Questi tipi di predicati circolari non sono consentiti? Come lo risolverei?
Grazie
Perché questo non funziona per definire "sposato" in Prolog?Come posso risolvere questo predicato circolare in Prolog?
married(X,Y):-married(Y,X).
Questi tipi di predicati circolari non sono consentiti? Come lo risolverei?
Grazie
Perdonami se ho la sintassi sbagliata, è stato un po 'che ho giocato con Prolog.
Una soluzione tipica è quella di introdurre un altro livello per le clausole, in questo modo:
married(X, Y) :- wife(X, Y).
married(X, Y) :- wife(Y, X).
e specificando i rapporti utilizzando la clausola moglie invece:
wife(jane, bob).
wife(alice, john).
?- married(jane, X).
X = bob
Maggiori informazioni possono essere trovato qui: CSc 8710, Deductive Databases and Logic Programming, chapter 6 - Logic and databases, sotto 6,5 - Relazioni speciali.
Come ho capito, il problema di base è che se le definizioni circolari sono consentite, anche se il linguaggio risultante è auto-consistente, ci possono essere conseguenze sottili che sono spesso contro-intuitive. Ci sono anche considerazioni sull'efficienza (le definizioni circolari comportano un sovraccarico extra).
Vedere questo detailed discussion per molte altre spiegazioni e diversi punti di vista.
Una possibile soluzione consiste nell'utilizzare la presentazione, ad es. this answer.