de exención de responsabilidad: Este es Xonix 'solución. Si te gusta vota él arriba. Pero como me tomó un buen esfuerzo averiguar qué estaba pasando, pensé que sería mejor que ofreciera mis comentarios para que otros pudieran beneficiarse.
En primer lugar, aquí es su solución como una cláusula adecuada:
criminal(K):-
member(K,[a,b,c,d]),
(K\=a -> A=1;A=0),
(K=d -> B=1;B=0),
(K=b -> C=1;C=0),
(K\=d -> D=1;D=0),
A+B+C+D=:=1.
Y dice así:
En un primer momento, que corre a través de la lista de personas (tienen que estar en minúsculas, entonces no son variables). K
se instancia a cada uno de ellos sucesivamente.
Con cada posible valor de K
, él repasa el resto de la cláusula. K
se puede interpretar como la hipótesis de quién es el criminal. Las siguientes 4 líneas son para proporcionar enlaces a cada una de las variables A, B, C y D. Puedes leerlas así: bajo el supuesto de que a
no es el criminal, a es veraz o no. Bajo la suposición de que d
es el criminal, b es veraz o no. Asf. Es decir, las variables A, B, ... capturan la veracidad del individuo correspondiente, dado un criminal específico.
Como una restricción conocida es el hecho de que solo uno de ellos es veraz, la suma de sus valores de verdad debe ser 1. Al retroceder, Prolog realiza el siguiente enlace para K y lo vuelve a ejecutar. Resulta que la restricción solo se cumple si a
es el criminal (y d
está diciendo la verdad, si no me equivoco). Linda.
he llegado hasta ese derecho: uno es un criminal, pero tres son mentirosos ?! – ThomasH