tutorial descargar prolog negation

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.