0% encontró este documento útil (0 votos)
26 vistas22 páginas

Prolog: Cláusulas, Recursión y Listas

Cargado por

Luchi zz
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
26 vistas22 páginas

Prolog: Cláusulas, Recursión y Listas

Cargado por

Luchi zz
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

PARADIGMA DE

LENGUAJE
LÓGICO

3er Año LCC- 4to Año LSI


FCEFyN - UNSJ -
 Un programa en Prolog es un conjunto de cláusulas
de Horn (hechos y reglas) definitivas de primer
orden.
 Una cláusula de Horn de primer orden es, una
cláusula cuantificada universalmente y contiene
exactamente un literal positivo. Por ej:
∀ xy (P(x, y) ∨ ¬Q(x, y) ∨ ¬R(x, y, z))
Repasando…
 En programación en lógica, simplemente:
P(x, y) :- Q(x, y), R(x, y, z).
“Toda variable que no se menciona en la cabeza de
una regla se debe suponer como cuantificada
existencialmente en la cola de ella”
 Es declarativo: un programa consiste en una
descripción del problema y el sistema decide
como encontrar la solución.
 Se fundamenta:
 Un Alfabeto: constante, variable, predicados
Prolog  Un Lenguaje: El lenguaje formal asociado con la
Repasando… lógica de predicados, es el conjunto de todas las
fórmulas que se pueden construir a partir del
alfabeto.
 Un conjunto de enunciados básicos – axiomas:
describen un fragmento de conocimiento.
 Un conjunto de Reglas de Inferencias: se aplican
a los axiomas para deducir nuevos enunciados
verdaderos.
Si A es Verdadero y A => B
entonces B es Verdadero
?- hombre(X).
Sintaxis
Aritmética
SWI-Porlog

is
Los operadores no efectúa ningún tipo de evaluación
aritmética.
?- 6 = 4 + 2. //No hay evaluación de la expresión
false.
?- 6 = 6. ?- N = 4 + 2.
true. N = 4+2.

El predicado de evaluación es el operador infijo is:

Aritmética ?- 6 is 4+2. ?- 6 is 6.
true. true.
?- N is 4 + 2. //Evalúa la expresión e instancia N
N = 6.
?- N is N + 1. ???
Si N esta libre ?-
Error.
Si N esta instanciado: ?- N = 4, N is N+1.
false.
Prolog NO posee asignación: El sistema realiza una
comprobación lógica.
Si una variable no esta ligada tratará de hacer V la relación,
vinculando la variable libre ( comparte el valor).
Ej.:

Aritmética
Aritmética
Analizar….
Algunas de las funciones predefinidas de SWI-
Prolog (No presente en otros dialectos)

?- succ(?Int1, ?Int2). //Para nros naturales


true. Si Int2 = Int1 + 1
En caso de ?- succ(X, 0) falla
Aritmética ? succ(X, -1) error de dominio

?- plus(?Int1, ?Int2, ?Int3).


true. Si Int3 = Int1 + Int2. (Al menos dos de los tres arg
deben estar instanciados a enteros)

?- abs(+Expr). // Evalua Expresión y retorna su valor absoluto.

+ : Parámetro de entrada: La variable debe estar instanciada.


? : Parámetro de entrada o salida.
- : Parámetro solo de salida.
 Se debe definir el caso de parada de la recursión.

 En la llamada de la cláusula recursiva al menos uno de los argumentos


crece o decrece, para así poder unificar en un momento dado con la
cláusula de la condición de parada.

Ej: Resolver el factorial de un nro.

?- factorial(3,K). K=6
Recursividad 1) FALLA
2) factorial (3, R) :- 3 > 0, A is 2, factorial(2,R1), R is 3 * R1.
X X X 2
1) FALLA
2) factorial (2, R) :- 2 > 0, A is 1, factorial(1,R1), R is 2 * R1.
X X X 1
1) FALLA
2) factorial (1, R) :- 1 > 0, A is 0, factorial(0,R1), R is 1 * R1.
X X X 1
1) R1 = 1.
(2) *)
Programas mal diseñados.
 Recursión circular:

Recursividad

 Recursión a izquierda:
Una lista es la estructura que permite representar
un conjunto de elementos.
Para operar con listas se separa en cabeza y cola
Listas
[Cabeza|Cola] //donde Cola es lista

El operador “|” (concatenar) se comporta como


analizador y constructor.
Notaciones válidas:
 Con constantes:
[3,5,7] //Lista con 3 elementos
Manejo de [3|[5,7]]
Listas [a,b,[c,d,e]] //donde [c,d,e] es sublista.

 Con variables
[X|Y]
[X,Y|Z]
[X|[Y|Z]]
SWI Prolog proporciona predicados para el
manejo de listas:
Listas
?- is_list(Term).
?- length(Lista, Long).
?- sort(Lista, ListaOrdenada).
?- append(List1, List2, ListUnion).
?- member(Elem, Lista). Elem es elemento de Lista
?- nextto(X, Y, Lista). Y está después de X en la Lista.
?- delete(List1, Elem, List2). List2 contiene los
Listas elementos de List1 sin Elem.

?- nth0(Index, Lista, Elem). Elem es el i-ésimo


elemento de Lista, comenzando por el 0.

?- reverse(List1, List2). List2 es List1 pero con el


orden de los elementos cambiado.
1. Definir un predicado que calcule la
longitud de una lista.

?- longitud([ 2,4,3,7,1],X).
X=5

Ejercicios longitud( [ ], 0).


longitud( [X | Y ] , R):- longitud (Y, R1), R is R1 +1.
1 [4,3,7,1]
2. Escribir la suma de los elementos
positivos de una lista.
3. Definir un predicado que ante la
Ejercicios consulta :
cons (1 , [2,3], Z)  Z=[1,2,3]
Ejemplo de los caminos: tengo varias
ciudades que están unidas por rutas en un
solo sentido. Debemos construir un programa
que permita dada una ciudad origen y una
ciudad destino; entregue el camino o los
caminos a seguir, siendo un camino una lista
Ejercicio con las rutas que debo recorrer.

1 3 BdC
B
A ruta( 1, a , b).
8 D ……….

2 4
C ?-camino( a, c, X)
X=[1,8]
X=[2]
1 B 3
A
8 D
2 C 4

Ejercicios
para ruta( 1, a , b). ?-camino( a, c, X)
ruta( 2, a , c). X=[1,8];
construir lista X=[2];
ruta( 8, b , c). ?-camino (d, b, X)
ruta( 3, b , d). false.
ruta( 4, c , d).
camino( C,C, [ ]) :- !. /*coinciden origen y destino
camino (Co, Cd, [X|Y]) :- ruta(X, Co, Ci),
camino (Ci, Cd, Y).
?-camino( a, c, X)

[Link]( 1, a , b).
[Link]( 2, a , c).
[Link]( 8, b , c).
[Link]( 3, b , d).
[Link]( 4, c , d).
[Link]( C,C, [ ]) :- !.
[Link] (Co, Cd, [X|Y]) :- ruta(X, Co, Ci),
camino (Ci, Cd, Y).
Seguimiento
6. Falla

7. camino (a, c, [X|Y]) :- ruta(X, a, Ci), camino (Ci, c, Y).


(b, c, Y)

1. X = 1 V 6. Falla
Ci = b
7........
* 2.
?-camino( a, c, X) X=[1,8] //Primera solución
x=[2] //Segunda solucion

6. falla
1 [8] [8]
[Link](a,c,[X|Y]) :- ruta(X,a,Ci), camino (Ci, c, Y).
2[]
1. X=1,Ci=b→ camino(b, c, Y)
[Link]
8 [] []
[Link](b,c,[X|Y]) :- ruta(X,b,Ci), camino(Ci,c,Y).
3.X=8, Ci=c→ camino(c, c, Y)
6. Y = [ ]
// 7. No se realiza por el !

* 4.X=3, Ci=d→ camino(d, c, Y)


[Link]
[Link](d,c,[X|Y]):-ruta(X,d,Ci),..
[Link].5. falla

[]
* 2. X=2,Ci=c→ camino(c, c, Y)
6. Y = [ ]
// 7. No se realiza por el !
[Link]
[Link]/p/Tutorial%20de%[Link]

Consultar:

También podría gustarte