Pregunta

Estoy leyendo http://cs.union.edu/~striegnk/learn-prolognow/html/node3.html#subsec.l1.kb1, pero tengo problemas para ejecutar el siguiente predicado:

SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007
| ?- woman(mia).
! Existence error in user:woman/1
! procedure user:woman/1 does not exist
! goal:  user:woman(mia)
| ?- 

Si, por otro lado, lo escribo en un archivo y ejecuto consultar el archivo, parece funcionar bien ...

¿Solo se me permite definir predicados en un archivo que más tarde consultarlos? ¿No puedo hacerlo en el editor en sí?

¿Fue útil?

Solución

Deberías entrar woman(mia). en un archivo para afirmarlo como un hecho. Si lo escribe en el intérprete, se toma como una consulta, no como un hecho.

Desde el SWI PROLOGA FAQ:

Los términos que ingresa en Toplevel son procesos como consultas, mientras que los términos que aparecen en un archivo que se carga en Prolog se procesa como un conjunto de reglas y hechos. Si un texto se lee a continuación, esta es una regla.

carnivore(X) :- animal(X), eats_meat(X).

Intentar ingresar esto en Toplevel resulta en el error a continuación. ¿Por qué? Porque una regla es un término :-( Cabeza, cuerpo) y porque el Toplevel interpreta los términos como consultas. No hay predicado con el nombre:- y dos argumentos.

?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR:   Rules must be loaded from a file ERROR:  
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt

¿No es esto estúpido? Bueno no. Supongamos que tenemos un término Eats_Meat (Rataplan). Si esto aparece en un archivo, establece el hecho de que Rataplan come carne. Si aparece en Toplevel, le pide a Prolog que intente probar si Rataplan come carne.

Si un texto lee

:- use_module(library(clpfd)).

Esta es una directiva. Las directivas son similares a las consultas, pero en lugar de pedirle al Toplevel que haga algo, le piden al compilador que haga algo. Al igual que las reglas y hechos, tales términos pertenecen a los archivos.

En lugar de escribir en un archivo, también puede usar assert en el nivel superior (como se explica más adelante en las preguntas frecuentes también).

Otros consejos

Es un poco molesto hacer predicados en el repl. Podrías hacerlo

| ?- ['user'].
woman(mia).
^D

es decir, consulte la entrada del usuario, o

| ?- assertz(woman(mia)).

afirmarlo. Ambos incómodos en mi opinión: puede haber una mejor manera, sin embargo, simplemente no lo sé. En general, es más fácil usar un script.

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