tutorial - descargar prolog
negaciĆ³n swi-prolog (1)
Me ha costado mucho buscar respuestas claras sobre la negación en Prolog, así que me disculpo si esta es una pregunta obvia:
Intento escribir un código simple que diga lógicamente que "X e Y se aman si a X le gusta Y y solo a Y." Mi código .pl se ve así:
likes(mary,john).
likes(mary,chad).
likes(john,mary).
loves(X,Y):- likes(X,Y), /+likes(X,Z).
Luego ejecuto mi programa y simplemente pregunto:
?- loves(X,Y).
pero siempre sale falso. Según mi lógica, debería volver diciendo ''X = john, Y = mary''.
He intentado algunas combinaciones de separar la negación con cortes, probando múltiples líneas para definir "amores" ... Probablemente me esté perdiendo un principio importante de negación, o quizás haya incluso una manera más fácil de implementar lo que estoy intentando hacer aquí. Por favor, hágame saber si puede ayudar!
Estoy usando SWI-Prolog (swipl) desde Debian Software Manager, si eso sirve de algo, aunque dudo que esto suponga una gran diferencia.
Tu problema es que Z
no está vinculado cuando tu regla pide /+likes(X,Z)
, entonces al menos siempre habrá Z = Y que invalida loves / 2. Quiero decir, dado que los Me gusta (X, Y) son ciertos, seguramente serán Me gusta verdaderos (X, Z).
Cambiarlo de esta manera:
loves(X,Y):- likes(X,Y), /+ (( likes(X,Z), Z /= Y )).
y obtendrás
?- loves(X,Y).
X = john,
Y = mary.