Pregunta

Soy nuevo en Prolog y estaba pensando por qué esta regla me da un resultado falso después de uno verdadero.

likes(1,banana).
likes(1,mango).

test :- likes(1,banana),likes(1,mango).

?- test.  
true;  
false.

Quiero saber el motivo de esta mentira.

¿Fue útil?

Solución

La forma en que funciona prolog es evaluando consultas hasta que fallan por negación.

Aquí, ha establecido dos hechos:

likes(1, banana). que dice "me gusta el plátano"

likes(1, mango). que dice "me gusta el mango"

Entonces has establecido una regla, que básicamente se evalúa como:

left_hand_side :- right_hand_side. left_hand_side si right_hand_side

La evaluación de la regla como consulta intenta hacer coincidir los hechos y devuelve true si puede, y false si no puede coincidir.Una cosa importante a tener en cuenta es que, si se especifica, prolog seguirá coincidiendo con los hechos siempre que las reglas evalúen true.

Así que avancemos test :- likes(1,banana),likes(1,mango).

Si test se ejecuta como una consulta, prolog primero lo intenta likes(1,banana) lo cual es un hecho previamente establecido, y es cierto.Luego, se pasa a likes(1,mango) lo cual, nuevamente, es un hecho y es cierto.Entonces Prolog ha llegado al final de la regla y genera true.

En este punto, si no está buscando más coincidencias, puede acortar la consulta y dejarla como verdadera.Sin embargo, si buscas más (todas) coincidencias, prórroga retrocede e intenta evaluar la regla nuevamente, buscando más coincidencias.

Sin embargo, dado que su regla solo coincide con "le gusta el plátano y le gusta el mango" y ya coincidimos likes(1,banana), cuando prolog retrocede e intenta evaluar likes(1,banana) Nuevamente, dado que ya lo emparejamos antes, esta vez no hay otro hecho (en otras palabras, no me puede gustar el plátano más de una vez, a menos que se haya definido) que coincida.Entonces ahí es donde el false viene de.

En su intérprete de prólogo es posible que pueda rastrear la ejecución de su programa escribiendo trace. luego ejecutando su consulta.Mi rastro se da a continuación:

| ?- trace
.
The debugger will first creep -- showing everything (trace)

(1 ms) yes
{trace}
| ?- test.
      1    1  Call: test ? 
      2    2  Call: likes(1,banana) ? 
      2    2  Exit: likes(1,banana) ? 
      3    2  Call: likes(1,mango) ? 
      3    2  Exit: likes(1,mango) ? 
      1    1  Exit: test ? 

true ? ;
      1    1  Redo: test ? 
      2    2  Redo: likes(1,banana) ? 
      2    2  Fail: likes(1,banana) ? 
      1    1  Fail: test ? 

(1 ms) no
{trace}
| ?-

Una última cosa a tener en cuenta:Si en lugar de pulsar ; en el true ? rápido, si hubiera presionado <ENTER>, el guión habría terminado solo con el true.

Me alegra que hayas hecho esta pregunta porque me permitió un pequeño repaso sobre Prolog, que realmente me gusta pero que no he usado en mucho tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top