¿Por qué no hace este trabajo para definir "casado" en Prolog?¿Cómo puedo solucionar este predicado circular en Prolog?
married(X,Y):-married(Y,X).
¿No se permiten estos tipos de predicados circulares? ¿Cómo lo arreglaría?
Gracias
¿Por qué no hace este trabajo para definir "casado" en Prolog?¿Cómo puedo solucionar este predicado circular en Prolog?
married(X,Y):-married(Y,X).
¿No se permiten estos tipos de predicados circulares? ¿Cómo lo arreglaría?
Gracias
Perdóname si me da la sintaxis incorrecta, pasado un tiempo desde que jugué con Prolog.
Una solución típica es introducir otro nivel a las cláusulas, así:
married(X, Y) :- wife(X, Y).
married(X, Y) :- wife(Y, X).
y especificando las relaciones mediante la cláusula esposa en su lugar:
wife(jane, bob).
wife(alice, john).
?- married(jane, X).
X = bob
Más información se se encuentra aquí: CSc 8710, Deductive Databases and Logic Programming, chapter 6 - Logic and databases, en 6.5 - Relaciones especiales.
Según entiendo, el problema básico es que si se permite que las definiciones circulares, aunque el lenguaje resultante es auto-consistente, no puede haber consecuencias sutiles que suelen ser contrario a la intuición. También hay consideraciones de eficiencia (las definiciones circulares incurren en gastos adicionales).
ver este detailed discussion para las porciones más explicación y un buen número de puntos de vista diferentes.
Una posible solución es usar presentación, véase, por ejemplo this answer.