Almudena Bocinos Riobóo.
Diego Darío Guerrero Fernández.
Diego Darío Guerrero
Almudena Bocinos Riobóo
1
INDICE
• INTRODUCCIÓN.
• FUNDAMENTOS.
• TIPOS DE CONSULTAS.
• TIPOS DE BÚSQUEDAS.
• CONCURRENCIA.
• BASES DE DATOS.
• PRIMITIVAS.
• EJEMPLOS en PARLOGW…
Diego Darío Guerrero
Almudena Bocinos Riobóo
2
INTRODUCCIÓN
Parlog es un lenguaje de programación lógica
pensado para la resolución de problemas en
máquinas con varios procesadores de forma
concurrente. Su sintaxis es similar a PROLOG.

Fue el resultado de las investigaciones
realizadas en el Imperial College of Science
and Technology de Londres por Steve
Gregory en los años 1986 y 1987.

Diego Darío Guerrero
Almudena Bocinos Riobóo
3
INTRODUCCIÓN

ParlogW dispone de compilación
perezosa e incremental:
 Perezosa
porque un método se compila justo
antes de ser llamado.
 Incremental porque se compilan sólo los
métodos que se hayan modificado.
 En ParlogW puede forzarse la compilación
impaciente (eager) con “compile.”
Diego Darío Guerrero
Almudena Bocinos Riobóo
4
INTRODUCCIÓN
Los programas Parlog se almacenan en
ficheros, es recomendable dividir los
programas en varios ficheros para
aprovechar las características de
compilación de Parlog.
 Para facilitar el manejo de programas
con muchos ficheros, en parlogW se
incorporan comandos para guardar y
cargar “grupos de programas”.

Diego Darío Guerrero
Almudena Bocinos Riobóo
5
FUNDAMENTOS

Cada relación o predicado que tengamos debe
tener una declaración “modo”, que
determinará qué uso de una variable se va a
hacer.
mode cláusula( [nombre_var] modo ).
cláusulas(argumentos).
El nombre de variable es opcional.
El modo: ? Representa Entrada
^ Representa Salida
Diego Darío Guerrero
Almudena Bocinos Riobóo
6
Ejemplo de Declaración
mode cláusula( [nombre_var] modo ).
cláusula(argumentos).
Ejemplos
Preferible esta forma:
Sin nombre de variable:
Con nombre de variable:
mode español(?).
español(pepe).
español(juan).
mode español(persona?).
español(pepe).
español(juan).
Diego Darío Guerrero
Almudena Bocinos Riobóo
7
CONSULTAS
Las consultas en parlogW se realizan de
forma similar a prolog, especificando unos
objetivos a alcanzar, parlog dará SI o NO
dependiendo de si es alcanzado o no.
Ej.:
<- amigos(pepe,X). Pretende obtener en X los
amigos de pepe, pero parlog sólo dirá SI o NO.
Para obtener resultados de variables,
podemos usar las primitivas siguientes:

Diego Darío Guerrero
Almudena Bocinos Riobóo
8
MOSTRAR RESULTADOS

Vista normal:


Vista Incremental:


Con X,Y :: obj1. los resultados se mostrarán a medida que se
van generando.
Vista película:


Con X,Y: obj1. mostramos los resultados de las variables X e
Y tras ejecutar obj1.
Con X,Y::: obj1. Vemos los resultados cuando se van
generando, incluyendo variables sin ligar ( sin valores).
La lista de variables a visualizar puede sustituirse por
all si queremos que se vean todas las variables.
Diego Darío Guerrero
Almudena Bocinos Riobóo
9
Ejemplos de consultas:
Consultas Parlog:
<-amigo(‘Pepe’,’Rosa’).
NO
<-amigo(‘Pepe’,’Mari’).
ÉXITO
mode amigo(?,?).
amigo(‘Pepe’,’Juan’).
amigo(‘Pepe’,’Mari’).
amigo(‘Pepe’,’Luis’).
<-amigo(‘Pepe’,X).
ESPERA
INFINITA
Diego Darío Guerrero
Almudena Bocinos Riobóo
BÚSQUEDA
OR-PARALELA
10
Ejemplos de Consultas
<-amigo(‘Pepe’,’Rosa’).
fallo
<-amigo(‘Pepe’,’Mari’).
éxito
<-X:amigo(‘Pepe’,X).
Éxito,
X=Juan
Diego Darío Guerrero
Almudena Bocinos Riobóo
Si definimos la segunda
variable como salida:
¿Por qué no
devuelve
mode
amigo(?, ↑).
también
Mari y Luis?
amigo(‘Pepe’,’Juan’).
amigo(‘Pepe’,’Mari’).
Porque es un
Lenguaje
amigo(‘Pepe’,’Luis’).
Incompleto
11
SOLUCIÓN A INCOMPLETITUD
mode amigo(?,^).
amigo(‘Pepe’,’Juan’).
amigo(‘Pepe’,’Mari’).
amigo(‘Pepe’,’Luis’).
amigo(‘Pepe’,
[’Juan’,’Mari’,’Luis’]).
amigo(‘Rosa',
[‘Lara’,’Pili’,’Toni’]).
<-Y:amigo(‘Pepe’,Y).
Esta es una posible
solución para
obtener todos los
amigos de Pepe.
Diego Darío Guerrero
Almudena Bocinos Riobóo
Y=[‘Juan’,’Mari’,’Luis’]
succeeded
12
MOTIVO DE LA INCOMPLETITUD

ESTRATEGIA TEST-COMMIT-OUTPUT
La resolución se realiza en tres fases:

Test: Se comprueba cada cláusula que
puede emparejar con argumento de
entrada.
 Commit: Elegirá sólo una cláusula de las
anteriores.
 OutPut: Se unificarán las variables de
salida con el término encontrado en la
cláusula elegida.
Diego Darío Guerrero
Almudena Bocinos Riobóo
13
TIPOS DE BÚSQUEDAS

OR-PARALELA:

SECUENCIAL:
- mode amigo(?,?).
- mode amigo(?,?).
amigo(‘Pepe’,’Juan’).
amigo(‘Pepe’,’Mari’).
amigo(‘Pepe’,’Luis’).
amigo(‘Pepe’,’Juan’);
amigo(‘Pepe’,’Mari’);
amigo(‘Pepe’,’Luis’).
En este caso se obliga a
parlog a realizar una
búsqueda secuencial.
Diego Darío Guerrero
Almudena Bocinos Riobóo
14
TIPOS DE CONSULTAS
mode enteros(desdeN?,hastaN?,resultado^) .
Variable
Compartida
mode cuadrados(listaNumeros?,resultado^).
X,Y : enteros(1,1000,X) , cuadrados(X,Y).
AND-PARALELA
X,Y : enteros(1,1000,X) & cuadrados(X,Y).
SECUENCIAL
1
Proceso
enteros
Diego Darío Guerrero
1.000
Almudena Bocinos Riobóo
X
Proceso
cuadrados
Y
15
COMPARATIVA CON HASKELL
Podemos comparar el comportamiento de
la consulta and-paralela con la
evaluación perezosa de Haskell.
 El mecanismo de consulta secuencial
podría asemejarse a la evaluación
impaciente.
 El esquema de procesos usados por
Parlog recuerda a las redes de proceso
que utiliza Haskell.

Diego Darío Guerrero
Almudena Bocinos Riobóo
16
COMPARATIVA CON HASKELL



Haskell utiliza reducción de expresiones, mientras
que Parlog utiliza resolución y unificación.
Haskell está fuertemente tipificado, se definen los
tipos de los parámetros, en Parlog no.
Parlog permite usar los parámetros de entrada y
salida en cualquier posición del predicado. En Haskell
el tipo de parámetro de entrada y salida está
determinado por su posición en la lista de parámetros.


En haskell: funcion :: int  int. El de salida es el ultimo entero.
En parlog: funcion(int1^,int2?). Podemos poner primero el de
salida y luego el de entrada.
Diego Darío Guerrero
Almudena Bocinos Riobóo
17
PRIMOS (Haskell)

EN HASKELL:
 primos=map
head lprimos where lprimos = [2..] : map
criba lprimos
 Criba(p:xs) = [x | x xs, p ‘noDivideA’ x] where m
‘noDivideA’ n = mod n m =/= 0.
[2..]
primos
map head
Diego Darío Guerrero
Almudena Bocinos Riobóo
:
map criba
18
PRIMOS (Parlog)

EN Parlog:
mode primos(primos^).
primos(Primos) <enteros_desde(2,ListaEnteros),
cribar(ListaEnteros,Primos).
ListaEnteros
2
Proceso
Enteros_desde
Diego Darío Guerrero
Almudena Bocinos Riobóo
Proceso
cribar
Primos
19
Ejemplo de Variable Compartida
mode dueño(matrícula↑,dnipersona?).
dueño(’BBT4567’,’48029184T’).
dueño(‘CAB2005’,’21259337E’). Variable
Compartida
dueño(‘CEY9200’,’55621832M’).
mode multa(matrícula?,importe↑).
<-Y:dueño(matricula,’48029184T’),
multa(’BBT4567’,’180€’).
multa(matricula, Y).
multa(‘CAB2005’,’500€’).
multa(‘CEY9200’,’300€’). Y=180€
succeeded
Diego Darío Guerrero
Almudena Bocinos Riobóo
20
EXPRESAR CONCURRENCIA
Con los operadores , y & podemos expresar
cualquier situación de concurrencia.
<- obj1 , obj2. indica que las dos se ejecuten
concurrentemente.
<- obj1 & obj2. indica 1º obj1 y 2º obj2.
<- (obj1 , obj2) & (obj3 , obj4). Indica que obj1 y
obj2 sean concurrentes entres sí, pero que
deben finalizar antes de comenzar la ejecución
concurrente de obj3 y obj4.
Diego Darío Guerrero
Almudena Bocinos Riobóo
21
BASES DE DATOS. Solución a Incompletitud
Otra solución más elaborada consiste en utilizar las
capacidades de Bases de Datos que proporciona
Parlog.
database pred/Aridad.
pred(uno1, dos1,… A).
pred(uno2, dos2,… A).
…
Diego Darío Guerrero
Almudena Bocinos Riobóo
Sobre esta definición, (que
puede almacenarse en
ficheros), podemos realizar
consultas con set/3 y
subset/3.
22
BASES DE DATOS
set/3 , subset/3:
set(resultado^, term?, pred?).
La diferencia entre set y subset es que este último se ejecuta
de forma perezosa ( sólo devuelve los valores que se le piden)
mientras que set busca todas las soluciones antes de
terminar.
database amig/2.
amig(pepe,miguel).
amig(javier,jesus).
amig(pepe,antonio).
amig(paco,maria).
Diego
Darío Guerrero
Almudena Bocinos Riobóo
<- R: set(R,X,amig(pepe,X)).
resultado:
R=[miguel,antonio].
23
PRIMITIVAS DE PARLOG
Parlog proporciona un gran surtido de primitivas,
entre las que podemos encontrar:

Aritméticas:
 =:=/2,

=\=/2, </2,>/2, =</2, >=/2.
Unificación:
 =/2
, unifica variables.
 ==/2, comprueba si unifican.
 <=/2, unifica enlazando variables a la izq.


Ej.: f(X) <= f(Y), éxito, con X=Y, pero no con Y=X.
Evaluación:
 is/2
, evalúa expresiones. <- X is 3*4.
Diego Darío Guerrero
Almudena Bocinos Riobóo
24
PRIMITIVAS

Chequeo de tipos (en ejecución):
 atom/1,
integer/1, float/1, number/1,
atomic/1.

Escritura: ya vimos :, ::, ::: y ::::
 write/1,
writeq/1: escriben un dato en la
pantalla.
 display/1: muestra datos con la
representación interna que tenga.
 nl/0: nueva línea.
 tab/1: tab(N?): escribe N espacios.
Diego Darío Guerrero
Almudena Bocinos Riobóo
25
PRIMITIVAS DE LECTURA

read/1,char/1: lee un dato de la entrada
del usuario.
 la
primitiva read está implementada a muy
alto nivel, con el inconveniente de que su
ejecución bloquea todos los procesos
parlog que se estén ejecutando.

Key/1 : se bloquea el proceso que lo
llama hasta que se pulsa una tecla o el
ratón.
 No
bloquea todos los procesos porque esta
implementada
a
muy
bajo
nivel.
Diego Darío Guerrero
Almudena Bocinos Riobóo
26
PRIMITIVAS DE LECTURA

Una mezcla de las dos nos proporciona un
“read” que es capaz de no bloquear
todos los procesos:
Síncrona (bloquea)
Asíncrona (no bloquea)
mode schars(caracteres^).
mode achars(caracteres^).
schars([Char|Chars]) <getkey(Char) &
schars(Chars).
achars([Char|Chars]) <key(Char) &
achars(Chars).
Diego Darío Guerrero
Almudena Bocinos Riobóo
27
EJEMPLOS EN PARLOGW

Ahora veremos algunos ejemplos
completos en el entorno ParlogW:
 Representación
 Ordenación
Diego Darío Guerrero
Almudena Bocinos Riobóo
y búsqueda en árboles.
QuickSort de listas.
28
BIBLIOGRAFIA y MATERIAL

Programming in PARLOG. TOM CONLON – 1984
Razonando con Haskell para la comparativa con
Parlog.
HANDS ON PARLOG FOR WINDOWS 1.0 - 1995
PARLOG: paralelismo en programación lógica de
Pilar Bruis Gómez
PARLOGW: intérprete de parlog. 1995

Si quieres más sobre P.L. Concurrentes:





Animación Automática de Especificaciones OASIS utilizando
Programación Lógica Concurrente. Tésis de Patricio Orlando
Letelier Torres. U. Valencia.
Diego Darío Guerrero
Almudena Bocinos Riobóo
29
Descargar

Document