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

Recursion

El documento presenta un tutorial sobre programación lógica utilizando Prolog, describiendo conceptos fundamentales como cláusulas de Horn, la sintaxis del lenguaje y la evaluación aritmética. Se abordan temas como la recursividad, el manejo de listas y ejemplos de ejercicios prácticos para ilustrar su aplicación. Además, se mencionan funciones predefinidas y se proporciona un enlace para consultar más información.

Cargado por

Julian Romero
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)
0 vistas22 páginas

Recursion

El documento presenta un tutorial sobre programación lógica utilizando Prolog, describiendo conceptos fundamentales como cláusulas de Horn, la sintaxis del lenguaje y la evaluación aritmética. Se abordan temas como la recursividad, el manejo de listas y ejemplos de ejercicios prácticos para ilustrar su aplicación. Además, se mencionan funciones predefinidas y se proporciona un enlace para consultar más información.

Cargado por

Julian Romero
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(homero).
hombre(pericles). ?- hombre(X).
hombre(tio_cosas).
hombre(lucas).
hombre(abuelo).
mujer(morticia).
mujer(merlina).
Sintaxis mujer(abuela).
padre(homero, pericles).
padre(abuelo, homero).
padre(abuelo, lucas).
madre(homero, merlina).
madre(morticia, pericle).
hijo(X, Y) :- hombre(X), padre(Y, X).
hijo(X, Y) :- hombre(X), madre(Y, X).
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.
true.
?- N = 4 + 2. ?- N = X + 2.
N = 4+2. N = X+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.
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.
2 [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 ?-camino( a, c, X)
para ruta( 1, a , b). X=[1,8];
X=[2];
construir lista ruta( 2, a , c).
false
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]) :- Co \= Cd,
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]) :- Co \= Cd,
ruta(X, Co, Ci),
Seguimiento camino (Ci, Cd, Y).

6. Falla

7. camino (a, c, [X|Y]) :- true, 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 Seguimiento completo !!!
x=[2] //Segunda solucion

6. falla
1 [8] [8]
[Link](a,c,[X|Y]) :- true, ruta(X,a,Ci), camino (Ci, c, Y).
2[]
1. X=1,Ci=b

[Link]
8 [] []
[Link](b,c,[X|Y]) :- true, ruta(X,b,Ci), camino(Ci,c,Y).
3.X=8, Ci=c
6. Y = [ ]
* 7. falla

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

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

[]
* 2. X=2,Ci=c→ camino(c, c, Y)
6. Y = [ ]
* 7. falla
[Link]
[Link]/p/Tutorial%20de%[Link]

Consultar:

También podría gustarte