Sunteți pe pagina 1din 26

PROLOG Inteligencia Articial Universidad de Talca, II Semestre 2005 Jorge Prez R.

Introduccin a PROLOG o
PROLOG es un lenguaje interpretado basado en la lgica o de predicados de primer orden. Puede ser visto como un lenguaje de programacin o como o un demostrador mecnico de teoremas. a Fue implementado a principios de los aos 70 por Alain Coln merauer y junto con Lisp son los lenguajes que histricamente o se han utilizado para construir aplicaciones en gran parte de las ramas de IA. Hoy existen muchas implementaciones de PROLOG, la que nosotros usaremos es SWI-Prolog desarrollado en la Universidad de Amsterdam. Es una versin libre y puede ser deso cargada para distintos ambientes. http://www.swi-prolog.org

LPOP a la rpida... a
(supondremos cierta familiaridad con el tema) A grandes razgos la lgica de predicados de primer orden o (LPOP) es un lenguaje formal para expresar cierta parte del lenguaje matemtico. a Sus componentes principales son los predicados (atributos, relaciones), constantes, variables, y cuanticadores (, ). Ejemplo: Todos los hombres son mortales, y dado que Scrates es un hombre, o podemos concluir que Scrates es mortal. o Podemos modelarla con la siguiente frmula: o (X(hom(X) mor(X)) hom(socrates)) mor(socrates) que es una frmula de LPOP donde hom y mor son preo dicados, X es una variable cuanticada y socrates es una constante... la frmula resulta ser siempre verdadera. o Desde otro punto de vista podr amos pensar en la misma frmula anterior pero en un esquema de consulta donde: o 1. X(hom(X) mor(X)) 2. hom(socrates) son oraciones, y Q: mor(socrates)? es una consulta. Luego si suponemos las oraciones 1 y 2 como hechos verdaderos, y preguntamos por la consulta Q, la respuesta debiera ser SI. PROLOG sigue un esquema similar de hechos y consultas.
3

PROLOG
PROLOG es un lenguaje interpretado que nos permite especicar hechos y reglas, similares a los de LPOP, y luego hacer consultas sobre ellos. El interprete presenta un prompt para iteractuar ?-. La interaccin con el interprete es a partir del ingreso de o hechos y reglas de manera directa ?- [user]. |: aqu se ingresan los hechos y reglas uno a uno... o cargando desde un archivo ?- [ejemplo.pl]. Donde ejemplo.pl es el nombre de un archivo con los hechos y reglas a cargar. El prompt siempre est a la espera de consultas a responder. a Veremos con ejemplos las distintas formas de interaccin y o los conceptos fundamentales de PROLOG.

Hechos
Los hechos son el tipo bsico de oraciones de un prograa ma PROLOG. Supongamos que queremos modelar informacin genealgica acerca de un grupo de personas. Para esto o o utilizaremos los predicados o relaciones padre y madre sobre ciertas constantes. padre(juan, amanda). madre(ximena, amanda). madre(laura, juan). padre(andres, juan). padre(patricio, bonifacio). padre(juan, patricio). padre(juan, ana). madre(ximena, ana). Esto lo podemos ingresar haciendo ?|: |: |: [user]. padre(juan, amanda). madre(ximena, amanda). ....

o cargando desde un archivo ?- [genealogico.pl]. Los hechos anteriores representan un modelamiento del mundo en donde, por ejemplo Juan es el padre de Amanda. Algunas observaciones de sintaxis: los hechos son predicados instanciados en valores constantes, en nuestro caso juan y amanda son valores constantes. En PROLOG siempre las constantes comienzan con minscuu la, segn esto la oracin padre(Juan, Ana) no ser un hecho u o a de PROLOG ms adelante veremos qu signica. a e
5

Consultas
Dados los hechos agregados al interprete PROLOG, podemos hacer consultas como por ejemplo ?- madre(ximena,ana). Yes ?- padre(juan, ximena). No Los Yes y No son las respuestas que entrega PROLOG luego de presionar [enter]. Note que son consistentes con los hechos agregados. Consultas ms interesantes involucran el uso de variables (en a el sentido de la lgica LPOP que es distinta al de una variable o usual de un lenguaje de programacin). o Todas las variables en PROLOG comienzan con maysculas. u Cul puede ser el signicado de la siguiente consulta? a ?- padre(X, juan). En la anterior consulta X representa a una variable y juan a un valor constante. Cuando aparece una variable en una consulta, PROLOG la interpreta cmo una pregunta existencial, o sea ser equivao a lente a la consulta en LPOP X padre(X, juan)? Entonces la respuesta de PROLOG debiera ser Yes segn u nuestros hechos, pero la respuesta va ms all... a a ?- padre(X, juan). X = andres

Consultas (cont.)
La respuesta fue X = andres porque PROLOG determin que o si la variable X se reemplazaba por el valor constante andres la consulta era verdadera a partir de los hechos. En este caso PROLOG responde ms que slo Yes o No. a o En el ejemplo anterior despus de responder X = andres PROe LOG espera una accin del usuario, este puede preionar [enter] o o digitar ; obteniendo las siguientes respuestas: ?- padre(X, juan). X = andres Yes si presiona [enter], o ?- padre(X, juan). X = andres; No si digita ;. Para responder consultas PROLOG realiza un proceso de bsqueda entre los valores constantes y los predicados. u Si digitamos ; se le pide a PROLOG que siga buscando, si en el proceso de bsqueda PROLOG no encuentra un valor u constante para satisfacer la consulta la respuesta nal es No, por ejemplo ?- madre(ximena, X). X = amanda; X = ana; No

Consultas (cont.)
Tambin se pueden hacer consultas que involucren ms de e a una variable. ?- madre(X,Y). X = ximena, Y = amanda Yes Del mundo modelado por nuestros hechos es fcilmente dea ducible que el abuelo paterno de Ana es Andrs. cmo e o podemos consultar esto en PROLOG? Primero, sabemos que Andrs es el abuelo paterno de Ana e porque entre nuestros hechos existen los hechos padre(andres,juan). padre(juan,ana). La consulta a PROLOG debiramos hacerla pensando en pree guntar si existe un abuelo paterno para ana, dado que si esto efectivamente ocurre PROLOG responder Yes y adems ena a tregar la constante que hace verdadera la consulta. a Si lo miramos en LPOP la consulta debiera ser algo como Z(X(padre(Z, X) padre(X, ana)))? En PROLOG se sigue exactamente la misma idea: ?- padre(Z,X), padre(X,ana). Z = andres X = juan Yes En PROLOG el s mbolo , representa al conector de conjuncin lgico . o o Si no nos interesa el valor de X podemos usar la variable X.
8

Reglas
Las reglas en PROLOG son oraciones que nos permiten deducir informacin. o Su correspondencia en LPOP son las clusulas de Horn a denitivas. En nuestro primer ejemplo de LPOP ten amos 1. X(hom(X) mor(X)) 2. hom(socrates). La oracin 2 puede representarse por hom(socrates), y 1? o Un tipo especial de oracin en PROLOG son las reglas que o sirven para representar consecuencia lgica. o En PROLOG se usan los caracteres :- en correspondencia con el lgico. o La regla mor(X) :- hom(X). es la representacin en PROLOG de 1. o PROLOG impl citamente supone cuanticacin universal () o en todas las variables utilizadas en una regla particular As si ingresamos el programa PROLOG , hom(socrates). mor(X) :- hom(X). obtenemos respuestas como ?- mor(socrates). Yes

Predicados a partir de Reglas


En nuestro ejemplo de informacin genealgica nos gustar o o a contar con informacin de los abuelos (diferenciando el sexo). o Queremos tener un predicado abuelo(X,Y) que sea verdadero cuando X sea abuelo de Y. Esta informacin puede ser deducida desde los hechos, lo o menos prctico ser agregar nuevos hechos, mucho mejor a a agregamos reglas... abuelo(X,Y) :- padre(X,Z), padre(Z,Y). abuelo(X,Y) :- padre(X,Z), madre(Z,Y). Ahora podemos preguntar quin es abuelo de quin e e ?- abuelo(X,Y). X = andres, Y = amanda ; X = andres, Y = patricio ; X = andres, Y = ana ; X = juan, Y = bonifacio ; No

La regla anterior se podr haber denido tambin como a e abuelo(X,Y) :- padre(X,Z), (padre(Z,Y); madre(Z,Y)). El s mbolo ; representa la disyuncin , el o lgico. o o Ejercicio: dena la relacin herm(X,Y) para representar que X o e Y son hermanos.

10

Predicados Recursivos
Las reglas tambin pueden ser recursivas... tendrn la forma e a de una denicin recursiva usual de matemticas. o a Queremos denir la relacin ancestro(X,Y) con el sentido geo nealgico usual. o Para esto denimos un predicado para la relacin ancestroDirecto. o ancestroDirecto(X,Y) :- (padre(X,Y); madre(X,Y)). que representa el caso base de la denicin recursiva. o Luego denimos la relacin ancestro a parir del caso base y o una recursin: o ancestro(X,Y):- ancestroDirecto(X,Y). ancestro(X,Y):- ancestroDirecto(X,Z), ancestro(Z,Y). As obtenemos ?- ancestro(X,Y). X = juan, Y = amanda ; ...... X = andres, Y = juan ;

Ejercicio: modele un grafo dirigido usando constantes para los nodos (u,v, etc.) y un predicado e(U,V) para indicar las aristas. Un grafo particular resultar de los hechos que agrea gue a PROLOG.

Dena un predicado camino(U,V) para determinar si existe un camino dirigido entre dos nodos U y V. Dena un predicado ciclo(U) para determinar si en el grafo hay un ciclo dirigido que contenga al nodo U. Puede denir un predicado ciclo (sin argumentos)? Y un predicado caminoNoDirigido(U,V) para determinar si existe un camino entre U y V que no toma en cuenta la direccin o de las aristas?
11

Sintaxis y Semntica a
Los elemntos sintcticos bsicos de un programa PROLOG e a a son constantes, variables, functores y predicados. Los predicados son los elementos ms importantes y ha sido a el centro de nuestra discusin anterior. Cada predicado tiene o cierta aridad (cantidad de argumentos). Si el predicado p tiene aridad m escribiremos p/m. A cada predicado en PROLOG se le asocia un valor de verdad Yes o No. Las constantes pueden ser:

S mbolos que comienzan con letra minscula, por ej. x, y, u abc, etc., s mbolos encerrados en comillas simples, por ej. X, 5, x23, a, etc. Nmeros: enteros y/o reales, por ej. 4, 4.5, etc. u Caracteres y textos (strings): Los caracteres y los strings se encierran entre comillas dobles, por ej. "f", "fam", etc.
Las variables son s mbolos que comienzan con maysculas o u un underscore, por ej. X, x23, etc. La variable representada por el s mbolo es especial, ya veremos su signicado. Los functores representan a funciones, son similares sintctia camente a los predicados con la diferencia de que a ellos se les asocia un objeto en vez de un valor de verdad (no se consulta por un functor). Si f es un functor y m es su aridad escribiremos f/m. Veremos que los functores nos sirven por ejemplo para crear estructuras de datos en PROLOG. Estos tres ltimos tipos de elementos se llaman trminos. u e Diremos que un literal es un elemento de la forma p(t1,t2,...,tm) donde p/m es un predicado y cada ti es un trmino. e
12

Programas y Consultas
Un programa PROLOG est compuesto por un conjunto de a reglas de la forma l0 :- l1, l2, ..., ln. donde cada li es un literal. Los hechos pueden verse como reglas donde slo existe el o literal de ms a la izquierda (l0:-. o simplemente l0.). a Por ejemplo un programa ser a: padre(juan, amanda). padre(andres, juan). abuelo(X,Y) :- padre(X,Z), padre(Z,Y). bisabuelo(X,Y) :- abuelo(X,Z), padre(Z,Y). Una consulta PROLOG es simplemente una conjuncin de o literales (literales separados por comas) g1, g2, ..., gm. Los literales que aparecen en la consulta se llaman objetivos El interprete de PROLOG recibe como entrada un programa ms una consulta. La salida ser Yes si a partir del prograa a ma fue posible demostrar la consulta haciendo verdadero simultneamente todos sus objetivos, y No en el caso contrario. a Al demostrar un objetivo el interprete usa los conceptos de sustitucin y unicacin. o o

13

Sustitucin y Unicacin o o
Una sustitucin es simplemente un mapeo entre variables y o trminos, por ejemplo e

{X = juan, Y = amanda}
es una sustitucin. o Dada una sustitucin esta puede ser aplicada a un literal. Si o l es un literal y una sustitucin diremos que l es el literal o que resulta de l al cambiar sus variables segn el mapeo u indicado por , por ejemplo: padre(X,Y){X = juan, Y = amanda} corresponde al trmino e padre(juan,amanda) Se dice que una sustitucin unica a dos literales l1 y l2 si o ocurre que l1 es igual caracter a caracter a l2 (a veces usaremos para referirnos a esta igualdad). Por ejemplo, los literales padre(X,ana) y padre(juan,Y) son unicados por la sustitucin {X = juan, Y = ana} ya que o padre(X,ana){X = juan, Y = ana} y padre(juan,Y){X = juan, Y = ana} resultan ambos ser padre(juan, ana). En algunos casos hay ms de una sustitucin que unica a a o un par de literales, ej. padre(X,ana) y padre(Y,Z) Cul podr ser el unicador para el par de literales padre(X,ana) a a y padre(Y,X)? Hay ms de uno? Y para el par padre(X,ana) a y padre(Y,juan)?

14

Sustitucin y Unicacin (cont.) o o


El proceso de unicacin puede ser llamado en PROLOG o directamente usando el operador = ?- padre(Y,ana)=padre(Z,X). Y = _G339 X = _G339 Z = ana Yes Aqu PROLOG responde con Y = G339 y X = G339 queriendo decir que los valores para Y y X pueden ser cualquiera siempre y cuando sean iguales. Otros ejemplos: ?- p(X,b,Z)=p(a,Y,f(T)). X = a Z = f(_G155) Y = b T = _G155 Yes ?- p(X)=q(a). No Note que en el primer ejemplo impl citamente se supone que f/1 debe ser un functor.

15

Qu Hace el Interprete PROLOG? e


Como ya mencionamos, el interprete de PROLOG recibe un programa y una consulta como entrada: g1, g2, ..., gm Desde el punto de vista DECLARATIVO el interprete responder Yes si existe un sustitucin tal que simultneamente a o a g1, g2, . . ., gm sean demostrables desde el programa. Que un objetivo unicado gi sea demostrable se puede denir recursivametne de la siguiente manera: Un objetivo gi es demostrable usando la unicacin si o 1. Existe una regla ch:-c1,c2,...,cn en el programa tal que 2. gi ch y, 3. c1, c2, . . ., cn son demostrables a partir del programa. Desde un punto de vista PROCEDIMENTAL la respuesta del interprete estar dada por la forma en que intenta y logra ena contrar la unicacin . El interprete hace una bsqueda en o u profundidad usando backt-tracking para encontrar , mantiene una lista de objetivos que se quieren demostrar y termina cuando la lista se vac a: 1. Recorre las reglas del programa secuencialmente intentando unicar el lado izquierdo de la regla con el primer objetivo de la lista. 2. Cuando logra unicar cambia el objetivo actual por el lado derecho de la regla aplicando la sustitucin a todos los o objetivos y prosigue con el nuevo primer objetivo. 3. Si el objetivo no pudo unicarse con el lado derecho de ninguna regla hace back-track al objetivo anterior y repite el paso 1 con la siguiente regla secuencial. En el proceso anterior siempre se busca el unicador ms a general (no unica variables que no sea necesario unicar) y se tiene especial cuidado con los nombres de las variables.
16

Qu Hace el Interprete PROLOG? Ejemplo: e


Supongamos el siguiente programa 1. 2. 3. 4. 5. 6. 7. 8. grande(oso). grande(elefante). chico(gato). cafe(oso). negro(gato). gris(elefante). oscuro(Z):- negro(Z). oscuro(Z):- cafe(Z).

y la consulta ?- oscuro(X),grande(X). el interprete ejecutar a la siguiente secuencia: 1: 2: 3: 4: 5: 4: 5: oscuro(X), grande(X) negro(X), grande(X) grande(gato) negro(X), grande(X) oscuro(X), grande(X) cafe(X), grande(X) grande(oso) (reg.7) (X = gato reg.5) (Falla, back-track 2) (Falla, back-track 1) (reg. 8) (X = oso reg.4) (reg.1) (Yes, lista vac a)

Si tenemos en cambio el programa padre(juan, ramon). padre(ramon, jorge). ancestro(X,Y) :- ancestro(X,Z), padre(Z,Y). ancestro(X,Y) :- padre(X,Y). obtenemos el siguiente resultado al preguntar por los ancestros de Jorge: ?- ancestro(X,jorge). ERROR: Out of local stack Cul es el problema? a

17

Estructuras de Datos en PROLOG


Veremos el primer ejemplo de una lista. En forma abstracta una lista se puede denir recursivamente de la siguiente manera:

nil es una lista y corresponde a la lista vac a. Si l es una lista y a es una constante entonces, a seguida de l es tambin una lista. e
Si la idea de a seguida de l la capturamos por el functor seg(a,l) nuestra denicin de lista resulta: o lista(nil). lista(seg(X,L)) :- lista(L). as por ejemplo: ?- lista(seg(a,seg(b,seg(c,(seg(d,nil)))))). Yes Podemos denir algunos predicados sobre listas, por ejemplo el predicado primero/2, que se satisface cuando el primer argumento es el primer elemento de la lista en el segundo argumento. primero(X,L) :- L = seg(X,L2). Ntese como se us la unicacin. En este caso la variable o o o L2 no nos interesa para nada por lo que podemos usar primero(X,L) :- L = seg(X,_). Otra cosa importante es que lo nico que hacemos con L u unicarla por lo que podemos simplemente reemplazarla para obtener primero(X,seg(X,_)). que es la versin ms pequea del predicado primero/2. Ahora o a n podemos hacer:
18

?- primero(X, seg(a,seg(b,seg(c,(seg(d,nil)))))). X = a Yes Podemos denir el predicado ultimo/2 con el signicado evidente ultimo(X,seg(X,nil)). ultimo(X,seg(_,L)) :- ultimo(X,L). as por ejemplo: ?- ultimo(X, seg(a,seg(b,seg(c,(seg(d,nil)))))). X = d Yes Note que en esta denicin se ve claramente la recursividad, o una denicin base ms una regla denida en funcin del o a o mismo predicado. Es claro que en los dos ejemplos anteriores los predicados se pueden utilizar como operaciones sobre listas para obtener el primer y ltimo elemento de ellas. u Ejercicio: Qu tan ecientes son las operaciones anteriores e con respecto a la cantidad de elementos de las listas? (la eciencia est dada por la cantidad de pasos del backtraking a usado para responder). Ejercicio: dena predicados segundo/2 que se satisfaga cuando el primer argumento sea el segundo elemento de la lista en el segundo argumento, y penultimo/2 que se satisfaga cuando el primer argumento sea el penltimo elemento de la lista en u el segundo argumento.

Listas en PROLOG
Las listas son elementos bsicos del lenguaje PROLOG y se a encuentran predenidas. En esta denicin, la lista vac se denota como [] y nuestro o a functor seg corresponde al operador . (punto). As por ejemplo nuestros predicados primero/2 y ultimo/2 pueden denirse como primero(X,.(X,_)). ultimo(X,.(X,[])). ultimo(X,.(_,L)) :- ultimo(X,L). Para simplicar la lectura y creacin de listas PROLOG deo ne nuevas formas, por ejemplo la lista .(a,.(b,.(c,.(d,[])))) es equivalente a [a,b,c,d], que tambin puede escribirse como e [a|[b,c,d]] o [a,b|[c,d]]. Algunas otras equivalencias: .(a,[]) .(a,.(b,[])) .(a,X) .(a,.(b,X)) [a|[]] [a|[b|[]]] [a|X] [a|[b|X]] [a] [a,b] [a|X] [a,b|X]

Hay que tener cuidado al trabajar con el operador |, la lista [a|L] es totalmente diferente a la lista [a,L] por qu? e Con esta notacin nuestros predicados se pueden implemeno tar como primero(X,[X|_]). ultimo(X,[X])). ultimo(X,[_|L]) :- ultimo(X,L).

19

Operaciones sobre Listas


Pertenencia El predicado estndar en PROLOG es member/2 y se puede a implementar como member(X,[X|_]). member(X,[_|L]) :- member(X,L). Concatenacin o El predicado estndar es append/3 que recibe como argumena to tres listas y es tal que append(L1,L2,L3) es verdadero cuando L3 es el resultado de la concatencacin entre L1 y L2. o Separando el caso base y el recursivo obtenemos la siguiente denicin o append(L1,L2,L3) :- L1 = [], L2 = L3. append(L1,L2,L3) :- L1 = [X|L1s], append(L1s,L2,L3s), L3 = [X|L3s]. La denicin dice que el predicado es verdadero si L1 es vac o o y L2 es igual a L3, o si L3 es igual al primer elemento de L1 seguido de la concatenacin entre L1 sin su primer elemento o y L2. Lo anterior tambin se puede representar por e append([],L2,L2). append([X|L1s],L2,[X|L3s]) :- append(L1s,L2,L3s). Note que solamente se reemplazaron las unicaciones.

20

Operaciones sobre Listas (cont.)


Reverso Llamaremos reverse/2 al predicado, siendo reverse(L1,L2) verdadero cuando la lista L2 tenga exactamente los mismos elementos que la lista L1 pero en orden inverso. La siguiente es una implementacin que usa append/3. o reverse([],[]). reverse([X|L1s],L2) :- reverse(L1s,R), append(R,[X],L2). La siguiente es una versin alternativa para reverse/2, usa un o predicado auxiliar reverse/3 pero evita el uso de append/3. reverse(L,R):- reverse(L,[],R). reverse([X|Ls],Acum,R):- reverse(Ls,[X|Acum],R). reverse([],R,R). Qu responden las dos versiones de reverse frente a la cone sulta reverse(L,[1,2,3])? primera versin: L = [3, 2, 1] o segunda versin: ERROR: Out of local stack o El problema surge porque para la segunda versin el primer o argumento no puede ser una variable. Cuando se disea un predicado en PROLOG, se debiera tener n claro cules de sus argumentos deben estar instanciados (no a ser una variable) al momento de la llamada, cules no y para a cules no hay restriccin. a o

21

Operaciones sobre Listas (cont.)


Ejercicios: escriba los predicados eliminar/3 tal que eliminar(L1,X,L2) se satisface cuando L2 es igual a L1, pero sin una ocurrencia de X. sublista/2 que se satisface cuando el primer argumento es una sublista del segundo. igual largo/2, mayor largo/2 y menor largo/2 predicados entre listas. Permutacin o Llamaremos permutacion/2 al predicado que queremos, siendo permutacion(L1,L2) verdadero cuando la lista L2 sea una permutacin de L1. Usaremos el predicado eliminar/3 recin o e mencionado. permutacion([],[]). permutacion(L1,[X|L2]) :- eliminar(L1,X,L3), permutacion(L3,L2). Este predicado debe ser llamado instanciando siempre su primer argumento. Por qu? e Qu pasar si intercambiramos los argumentos de la llae a a mada recursiva (si hiciramos permutacion(L2,L3))? e

22

Manejo de Constantes Numricas e


En PROLOG los objetos numricos pueden corresponder a e tipos integer o float de C. Para realizar operaciones numrie cas, se tiene el predicado is, que se comporta como una asignacin en un lenguaje imperativo. As el objetivo X is o , <expresin> ser verdadero cuando X unique con el resultao a do numrico de evaluar <expresin>. e o Por ejemplo, si denimos: masuno(X,Y):- Y is X+1. xmasuno(X,Y):- Y = X+1. observaremos el siguiente comportamiento: ?- masuno(4,5). Yes ?- masuno(5,Y). Y = 6 Yes ?- masuno(6,6+1). No ?- xmasuno(4,5). No ?- xmasuno(5,Y). Y = 5+1 Yes ?- xmasuno(6,6+1). Yes

PROLOG ofrece adems el siguiente conjunto de predicaa dos:

=:= y =\= que permiten comparar dos valores numricos. El e primero es verdadero si los valores son iguales, y el segundo si son diferentes. <, >, =< y >=, que corresponden a comparaciones usuales.
Las expresiones aritmticas se forman de la manera usual e utilizando parntesis y operadores +, -, *, mod, / y // correse pondiendo estos ltimos a la divisin de punto otante y u o entera, respectivamente.
23

Manejo de Caracteres y de Strings


Un caracter en Prolog es simplemente un nmero entre 0 y u 127, correspondiente a los caracteres de la tabla ASCII. Un string se maneja como una lista de caracteres. Por ejemplo: ?- X = "un string.". X = [117,110,32,115,116,114,105,110,103,46] Yes Interesante porque podemos usar operaciones sobre listas para manipular y hacer consultas sobre strings, por ejemplo si tenemos la regla: palindrome(X) :- reverse(X,X). podemos hacer las consultas ?- palindrome("hola"). No ?- palindrome("anicocina"). Yes ?- palindrome("maripositatisopiram"). Yes

24

Aplicaciones: Generacin y Prueba o


Una estrategia comn usada para resolver problemas en IA. u La idea bsica es generar las distintas posibilidades del esa pacio de bsqueda (generacin) hasta que se encuentre una u o solucin (prueba). o Ordenar una Lista Queremos crear un predicado ordenar/2 tal que ordenar(L1,L2) que se hace verdadero cuando L2 es equivalente a la lista L1 ordenada. Supondremos que siempre L1 estar instanciada y a no es vac a. Las distintas posibilidades las podemos generar usando el predicado permutacion/2. Slo necesitamos un predicado para vericar si una lista cualo quiera se encuentra ordenada, lo llamaremo ordenada/1: ordenada([_]). ordenada([X,Y|L]) :- X =< Y, ordenada([Y|L]). Ahora slo tenemos que generar y probar: o ordenar(L1,L2) :- permutacion(L1,L2), ordenada(L2). Ahora podemos hacer ordenar([4,1,3,2],L). L = [1, 2, 3, 4] Yes Este algoritmo es my ineciente en el peor caso tendr que a generar las N ! permutaciones para una lista de largo N . Ejercicio: implemente otros algoritmos de ordenacin (no o por generacin y prueba) con predicados como selectsort/2, o insertsort/2 y quicksort/2 correspondientes a los algoritmos ms conocidos. a
25

S-ar putea să vă placă și