2012-04-10 20 views
6

Soy nuevo en la programación de prólogos y en un tutorial he indicado que defina una lista de estructuras (en un script) para que pueda consultarla como una base de datos. Sin embargo, me resulta imposible definir esta lista como una variable en un script. Cuando defino una lista comoDefinición de listas en los scripts de prólogo

X=[a,b,c]. 

yo sólo recibo un error que dice

No permission to modify static_procedure `(=)/2' 

¿Se Prolog es compatible con la definición de las variables de este tipo? Estoy usando SWI-Prolog en Linux.

Respuesta

14

En Prolog hablamos de variables lógicas, que significa identidad entre literales.

Es decir, un programa es un conjunto de reglas que colectivamente declaran lo que es cierto acerca de nuestros literales, y que los literales son no interpretados. Escribimos reglas usando variables para describir relaciones sobre individuos, y mientras tratamos de probar si nuestra consulta puede ser cierta, Prolog vincula variables según lo dicte la regla.

Una lista es simplemente azúcar sintaxis de una relación binaria entre un término (la cabeza ) y (nótese la recursividad aquí) una lista. Usualmente, cuando hablamos de una base de datos , usamos hechos (reglas sin cuerpo, siempre verdaderos) que enlazan literales atómicos.

De modo que ese tutorial probablemente exprese la tarea en palabras diferentes de las que informa, o es algo engañoso.Se podría de todos modos almacenar listas en su base de datos como tal:

mylist([a,b,c]). 

y escribir su programa como:

myprog(X) :- mylist(L), member(X, L). 

A continuación, puede consultar el programa como:

?- myprog(X). 

y Prolog, tratando para probar myprog/1, intentar probar mylist/1 y miembro/2 ... Para probar mylist (X) la variable X se une a [a, b, c].

HTH

0

no, no puedes hacerlo así. ¿qué estás básicamente escritura es:

=(X,[a,b,x]). 

y como dice el error no se puede redefinir =/2

lo que podría hacer es:

x([a,b,c]). 

y cuando desea utilizar X:

... 
x(X), 
foo(X) 
... 
5

Cuando se escribe

X = [a, b, c]. 

se lee como

=(X, [a, b, c]). 

que se lee como una definición de un hecho en relación con el predicado =/2. Un hecho en el que cualquier variable libre sería igual a [a, b, c]. Es decir, redefine =/2. ¡Eso obviamente no es lo que pretendes!

Debe recordar en Prolog que las variables tienen un ámbito local, dentro de un predicado. Lo que funcionaría es:

main :- 
    X = [a, b, c], 
    % do stuff with X. 
1

utilizo swipl bajo Linux, para definir una lista de prólogo.

mylist([element1,element2,elementn]). 

A continuación, se puede consultar el programa:

?- mylist(A).