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: