ProLog:Predicados predefinidos
Evelin Yasmyn Padilla Sulca Estudiante de Computaci´n Cient´ o ıfica Universidad Nacional Mayor de San Marcos email:epasu08@gmail.com

5 de octubre de 2012

”.Predicados predefinidos El esquema condicional en PROLOG. tal y como vemos en los siguientes ejemplos. En PROLOG la “Y” l´gica corresponde a la “. . o a Equivalente a la definici´n de varias cl´usulas para el mismo o a predicado es el uso del predicado predefinido “.” y la “O” l´gica a o o la definici´n de varias cl´usulas para el mismo predicado.

su posici´n (infijo. prefijo o postfijo) y su o asociatividad(cuando se combinan operadores de la misma precedencia). PROLOG permite definir representaciones infijas utilizando la notaci´n operador. . PROLOG o a permite definir representaciones infijas utilizando la notaci´n o operador. Para definir operadores necesitaremos o determinar su precedencia (que establece un orden de evaluaci´n o del operador).La notaci´n operador o PROLOG utiliza por defecto notaci´n prefija“+(x. ∗(y . z))” (que o internamente corresponde a una representaci´n en ´rbol.

o . o Y esos hechos ser´n equivalentes a: a es (juan . * el-jarr´n contiene flores. podemos definir los ´tomos es y contiene como operadores infijos y a escribir hechos de la siguiente manera: * juan es listo.listo). Por ejemplo. flores).Un programador puede definir sus propios operadores. contiene (el-jarr´n.

La m´xima precedencia a corresponde a los ultimos operadores que se evaluar´n.Por ejemplo. yfx • Prefijos: fx. los ´ a m´s ”d´biles”. yf donde x e y se refieren a los argumentos y f al funtor o nombre de predicado declarado como operador. : − ). fy • Postfijos: xf. La precedencia va de 1 a 1200. . a e La posici´n vendr´ determinada en el segundo argumento por: o a • Infijos: xfx. el operador “:-“ se define como infijo con la m´xima a precedencia: : −op(1200. xfx. es decir. xfy.

fx. Tendremos que hacer uso de par´ntesis. Por ejemplo. not(not p) o definir el e operador not como :-op(500. o Entonces no podremos utilizar not not p.fy.not). x se refiere a un argumento cuya precedencia es estrictamente menor que la precedencia del operador e y se refiere a un argumento cuya precedencia es menor o igual que la precedencia del operador. si la definici´n del operador not es: :-op(500. .not). porque el argumento de not es de la misma precedencia que not y no estrictamente menor.La asociatividad viene representada por los caracteres x e y .

a Existen b´sicamente dos tipos de predicados predefinidos: a • Aquellos predicados de uso frecuente que ya los proporciona PROLOG. • Predicados con un efecto colateral distinto a la instanciaci´n de o variables a valores(funcionamiento normal del PROLOG).Predicados predefinidos Los predicados predefinidos son aquellos que ya est´n definidos en a PROLOG. A continuaci´n se da una lista de aquellos predicados predefinidos o que son m´s utilizados. aunque podr´ ıamos definirlos nosotros.clasificados seg´n su funci´n. que no necesitamos especificarlos mediante cl´usulas. a u o .

Clasificaci´n de t´rminos o e Este conjunto de predicados predefinidos permiten determinar el tipo de t´rminos que estamos usando. e • var/1 El objetivo var(X) se cumple si X es una variable no instanciada. • integer/1 El objetivo integer(X) se cumple si X representa un n´mero entero. • novar/1 El objetivo novar(X) se cumple si X es una variable instanciada. a . • atom/1 El objetivo atom(X) se cumple si X representa un ´tomo a PROLOG. u • atomic/1 El objetivo atomic(X) se cumple si X representa un entero o un ´tomo.

• true/0 Este objetivo siempre se cumple.Control de otros predicados Los siguientes son predicados predefinidos que permiten controlar otros predicados. • fail/0 Este objetivo siempre fracasa. • !/0 (cut) El s´ ımbolo de “corte” es un predicado predefinido que fuerza al sistema PROLOG a mantener ciertas elecciones que ha realizado. El objetivo not(X) fracasa si el intento de satisfacer X tiene ´xito. • not/1 Suponiendo que X est´ instanciada a un t´rmino que a e pueda interpretarse comoun objetivo. e . El objetivo not(X) se cumple si fracasa el intento de satisfacer X.

una o o l´gica) de objetivos. e • ./2 El funtor “./2 El funtor “.” espec´ ıfica una conjunci´n de objetivos.” espec´ ıfica una disyunci´n (es decir. El objetivo call(X) se cumple si tiene ´xito el intento de satisfacer X. o • . o .• repeat/0 El predicado predefinido repeat se da como una forma auxiliar para generar soluciones m´ltiples mediante el mecanismo u de reevaluaci´n. o • call/1 Suponiendo que X est´ instanciada a un t´rmino que a e pueda interpretarse como un objetivo.

El argumento debe ser a un ´tomo que d´ el nombre del fichero del que se van a leer las a e cl´usulas. a • reconsult/1 El predicado reconsult es similar a consult. excepto que las cl´usulas le´ a ıdas sustituyen a todas las dem´s cl´usulas a a existentes para el mismo predicado.Introducci´n de nuevas cl´usulas o a • consult/1 El predicado predefinido consult est´ pensado para a situaciones en las que se quiera a˜adir las cl´usulas existentes en n a un determinado fichero (o que se tecleen en el terminal) a las que ya est´n almacenadas en la base de datos. (Muy util para corregir ´ errores de programaci´n) o .

F. Es decir. u • functor/3 El predicado functor se define de tal manera que functor(E. El segundo especifica e la estructura donde debe buscarse el argumento. N) significa que E es una estructura con funtor o nombre de predicado F y aridad N. Se usa para acceder a un determinado argumento de una estructura. . E. PROLOG encuentra el argumento apropiado y entonces intenta hacerlo corresponder con el tercer argumento.Construcci´n y acceso a componentes de estructuras o • arg/3 El predicado arg debe utilizarse siempre con sus dos primeros argumentos instanciados. arg(N. El primer argumento de arg especifica qu´ argumento se requiere. A) se cumple si el argumento n´mero N de la estructura E es A.

.b]] . dada una lista o de argumentos.. L=[append.• name/2 El predicado name se usa para manejar ´tomos a arbitrarios.L) significa que los caracteres del ´tomo A son los a miembros de la lista L.[b].L significa que L es la lista que consiste en el funtor X seguido de los argumentos de X. El predicado name relaciona un ´tomo con la lista de a caracteres (c´digos ASCII) que lo constituyen.L./2 El predicado “=. El objetivo o name(A. append([a].[a. • =.[a..b])=.” (pronunciado “univ” por razones hist´ricas) se utiliza para construir una estructura.[b].[a]. Ej.. El objetivo X=.

ıa a • spy/1 El predicado spy se utiliza cuando se quiere prestar especial atenci´n a objetivos que incluyan ciertos predicados espec´ o ıficos. El argumento puede ser: un ´tomo. o podr´ verse cada uno de los objetivos generados por el programa a en cada uno de los cuatro puertos principales. Sin embargo. como operador prefijo.Supervisi´n de PROLOG en su funcionamiento o • trace/0 El efecto de satisfacer el objetivo trace es activar un seguimiento exhaustivo. a continuaci´n. e a una estructura de la forma nombre/aridad o una lista. . de forma que no hace falta poner el argumento entre par´ntesis. los seguimientos debidos a la presencia de puntos esp´ continuar´n. • notrace/0 El efecto de satisfacer el objetivo notrace es desactivar un seguimiento exhaustivo. Esto se hace fijando en ellos puntos esp´ El predicado se define ıa. Esto significa que.

nospy es un operador prefijo. e ıa . • nospy/1 Como spy.• debugging/0 El predicado predefinido debugging permite ver qu´ puntos esp´ se han establecido hasta el momento. nospy es m´s a selectivo que nodebug. La lista de e ıa puntos esp´ se escribe como efecto colateral al satisfacerse el ıa objetivo debugging. ya que puede especificar exactamente qu´ puntos esp´ se quieren retirar. • nodebug/0 El objetivo nodebug retira todos los puntos esp´ ıa activos en ese momento.

• nl/0 Escribe una secuencia de control al canal de salida activo que genera una “nueva l´ ınea”. nl s´lo se cumple una vez.Lectura/escritura y manejo de ficheros Lectura/escritura de t´rminos e • write/1 El objetivo write(X) escribe el t´rmino X en el canal de e salida activo. o • read/1 El objetivo read(X) lee el siguiente t´rmino del canal de e entrada activo. . La entrada proporcionada desde teclado debe terminar con “. • display/1 El predicado display funciona exactamente igual que write. read s´lo se cumple una o vez.”. write s´lo se cumple una vez (no se puede o resatisfacer). excepto que pasa por alto las declaraciones de operadores. y lo hace coincidir con X.

Si X no o est´ instanciada. put s´lo se cumple una vez. o . get s´lo se cumple una vez. a get0 s´lo se cumple una vez. o • get0/1 Este objetivo se cumple si X puede hacerse corresponder con el siguiente car´cter encontrado en el canal de entrada activo. a • get/1 Este objetivo se cumple si X puede hacerse corresponder con el siguiente car´cter imprimible encontrado en el canal de a entrada activo.Lectura/escritura de caracteres • put/1 Este objetivo escribe el entero X como car´cter en el canal a de salida activo. se produce un error.

• telling/1 Este objetivo se cumple si X coincide con el nombre del canal de salida activo. se crea un fichero con ese nombre. fracasando en caso contrario. haciendo que se escriba una marca de fin-de-fichero al final del fichero. • told/1 Este objetivo cierra el canal de salida activo. . Si se utiliza tell con un fichero ya existente.Lectura /escritura en ficheros • tell/1 El objetivo tell(X) abre el fichero X si no estaba abierto. Si X no est´ instanciada se produce un error. La primera vez que se utiliza a tell sobre un fichero no existente. El nuevo canal de salida activo pasa a ser la pantalla del ordenador del usuario. y define el fichero X como canal de salida activo. el contenido de dicho fichero se destruye.

se produce un error.• see/1 El objetivo see(X) abre el fichero X. • seeing/1 Este objetivo se cumple si el nombre del canal de entrada activo coincide con X. • seen/1 Este objetivo cierra el canal de entrada activo. si todav´ no ıa est´ abierto. o su nombre a corresponde a un fichero que no existe. . fracasando en caso contrario. y define al canal de entrada activo de tal forma que a su origen sea el fichero X. Si X no est´ instanciada. asignando el nuevo canal de entrada activo al teclado del ordenador del usuario.

• asserta/1 A˜ade cl´usula al principio del conjunto de cl´usulas n a a que tienen el mismo nombre de predicado. . n a • assert/1 A˜ade cl´usulas al final del conjunto de cl´usulas en la n a a BD que tienen el mismo nombre de predicado.Manipulaci´n de Bases de Datos o A˜adir cl´usulas a la BD.

es decir.Borrar cl´usulas de la BD. a • retract/1 Borra una cl´usula de la BD. . Haciendo backtracking a podremos borrar todas las cl´usulas y con cada una de ellas a efectuar las operaciones que nos interesen. no se almacenan f´ o ısicamente en ninguna base de datos. • retract-all/1 Borra todas las cl´usulas de la BD con el nombre y a aridad que aparece en el argumento. Estas formas de a˜adir y n borrar son l´gicas.

a • findall/3 Busca en la base de datos todas las ocurrencias de t´rmino (primer argumento) que satisfacen el objetivo (incluido e en el segundo argumento) y devuelve todas las instancias en una lista (tercer argumento) desordenada.Visualizar cl´usulas de la BD. .

+String2. o • Substring(+String1.?Lista3) Se satisface si Lista3 es el resultado de a˜adir Lista2 a Lista1 n .?Posicion) Se satisface si String2 es una sublista de String1 que comienza en la posici´n o Posicion. • concat-atoms(+Src1.?Dest) Se satisface si Dest es la concatenaci´n de los t´rminos at´micos que aparecen en la lista o e o List.?Length) Se satisface si length es la longitud del ´tomo Atom.?Lista2.Otros predicados predefinidos • atom-length(+Atom.+Src2. a • concat-atom(+List. • append(?Lista1.?Dest) Se satisfae si Dest es la concatenaci´n de Src1 y Src2.

• member(?Term.• checklist(+Pred.?Lista2) Se satisface si Lista2 es Lista1 menos una ocurrencia de Elemento en Lista1.+Lista) Se satisface si Pred(Elem) es verdad para cada elemento de la lista Lista. • delete(?Elemento.?Lista) Se satisface si el t´rmino Term unifica e con un miembro de la lista Lista.?N) Se satisface si la longitud de la lista Lista es N.?Comun) Se satisface si Comun se unifica con la lista que contiene los elementos en comun de las listas Lista1 y Lista2.?Lista1. • length(?List.+Lista2. • intersection(+Lista1. .

o .• nonmember(+Elem.+Lista) Se satisface si Elem no es un elemento de la lista Lista. • subset(?Sublista.+Lista2. a • union(+Lista1.+Lista) Se satisface si Lista contiene todos los elementos de Sublista en el mismo orden que en Sublista. • substract(+Lista1.?Union) Se satisface si Union es la lista que contiene la uni´n de los elementos de Lista1 y de Lista2.+Lista2.?Resto) Se satisface si Resto contiene aquellos elementos de Lista1 que no est´n en Lista2.

GRACIAS!!! .