29
1 Diego Darío Guerrero Almuden a Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández.

1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

Embed Size (px)

Citation preview

Page 1: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

1Diego Darío Guerrero Almudena Bocinos Riobóo

Almudena Bocinos Riobóo.

Diego Darío Guerrero Fernández.

Page 2: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

2Diego Darío Guerrero Almudena Bocinos Riobóo

• INTRODUCCIÓN.

• FUNDAMENTOS.

• TIPOS DE CONSULTAS.

• TIPOS DE BÚSQUEDAS.

• CONCURRENCIA.

• BASES DE DATOS.

• PRIMITIVAS.

• EJEMPLOS en PARLOGW…

INDICE

Page 3: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

3Diego Darío Guerrero Almudena Bocinos Riobóo

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.

INTRODUCCIÓN

Page 4: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

4Diego Darío Guerrero Almudena Bocinos Riobóo

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.”

INTRODUCCIÓN

Page 5: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

5Diego Darío Guerrero Almudena Bocinos Riobóo

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”.

INTRODUCCIÓN

Page 6: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

6Diego Darío Guerrero Almudena Bocinos Riobóo

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).

FUNDAMENTOS

El nombre de variable es opcional.

El modo: ? Representa Entrada^ Representa Salida

Page 7: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

7Diego Darío Guerrero Almudena Bocinos Riobóo

Preferible esta forma:

mode cláusula( [nombre_var] modo ).cláusula(argumentos).

Ejemplo de Declaración

Ejemplos

Sin nombre de variable:

mode español(?).

español(pepe).

español(juan).

Con nombre de variable:

mode español(persona?).

español(pepe).

español(juan).

Page 8: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

8Diego Darío Guerrero Almudena Bocinos Riobóo

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:

CONSULTAS

Page 9: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

9Diego Darío Guerrero Almudena Bocinos Riobóo

Vista normal: Con X,Y: obj1. mostramos los resultados de las variables X e

Y tras ejecutar obj1.

Vista Incremental: Con X,Y :: obj1. los resultados se mostrarán a medida que se

van generando.

Vista película: 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.

MOSTRAR RESULTADOS

Page 10: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

10Diego Darío Guerrero Almudena Bocinos Riobóo

<-amigo(‘Pepe’,’Rosa’).

<-amigo(‘Pepe’,’Mari’).

<-amigo(‘Pepe’,X).

mode amigo(?,?).

amigo(‘Pepe’,’Juan’).

amigo(‘Pepe’,’Mari’).

amigo(‘Pepe’,’Luis’).

NO

ÉXITO

ESPERA INFINITA

BÚSQUEDA OR-PARALELA

Ejemplos de consultas:

Consultas Parlog:

Page 11: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

11Diego Darío Guerrero Almudena Bocinos Riobóo

<-amigo(‘Pepe’,’Rosa’).

<-amigo(‘Pepe’,’Mari’).

<-X:amigo(‘Pepe’,X).

mode amigo(?, ↑).

amigo(‘Pepe’,’Juan’).

amigo(‘Pepe’,’Mari’).

amigo(‘Pepe’,’Luis’).

fallo

éxito

Éxito, X=Juan

Si definimos la segunda variable como salida:

Ejemplos de Consultas

¿Por qué no devuelve también Mari y Luis?

Porque es un Lenguaje

Incompleto

Page 12: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

12Diego Darío Guerrero Almudena Bocinos Riobóo

amigo(‘Pepe’,

[’Juan’,’Mari’,’Luis’]).

amigo(‘Rosa',

[‘Lara’,’Pili’,’Toni’]).

<-Y:amigo(‘Pepe’,Y).

Y=[‘Juan’,’Mari’,’Luis’]succeeded

SOLUCIÓN A INCOMPLETITUD

mode amigo(?,^).

amigo(‘Pepe’,’Juan’).

amigo(‘Pepe’,’Mari’).

amigo(‘Pepe’,’Luis’).

Esta es una posible solución para obtener todos los amigos de Pepe.

Page 13: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

13Diego Darío Guerrero Almudena Bocinos Riobóo

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.

MOTIVO DE LA INCOMPLETITUD

Page 14: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

14Diego Darío Guerrero Almudena Bocinos Riobóo

OR-PARALELA:

- mode amigo(?,?).

amigo(‘Pepe’,’Juan’).amigo(‘Pepe’,’Mari’).amigo(‘Pepe’,’Luis’).

TIPOS DE BÚSQUEDAS

SECUENCIAL:

- mode amigo(?,?).

amigo(‘Pepe’,’Juan’);amigo(‘Pepe’,’Mari’);amigo(‘Pepe’,’Luis’).

En este caso se obliga a parlog a realizar una búsqueda secuencial.

Page 15: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

15Diego Darío Guerrero Almudena Bocinos Riobóo

TIPOS DE CONSULTAS

mode enteros(desdeN?,hastaN?,resultado^) .

mode cuadrados(listaNumeros?,resultado^).

X,Y : enteros(1,1000,X) , cuadrados(X,Y).

X,Y : enteros(1,1000,X) & cuadrados(X,Y).

Proceso enteros

Proceso cuadrados

X

1

1.000

Y

AND-PARALELA

SECUENCIAL

Variable Compartida

Page 16: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

16Diego Darío Guerrero Almudena Bocinos Riobóo

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.

COMPARATIVA CON HASKELL

Page 17: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

17Diego Darío Guerrero Almudena Bocinos Riobóo

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.

COMPARATIVA CON HASKELL

Page 18: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

18Diego Darío Guerrero Almudena Bocinos Riobóo

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.

PRIMOS (Haskell)

map head map criba:

[2..]

primos

Page 19: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

19Diego Darío Guerrero Almudena Bocinos Riobóo

EN Parlog:mode primos(primos^).

primos(Primos) <-

enteros_desde(2,ListaEnteros),

cribar(ListaEnteros,Primos).

PRIMOS (Parlog)

Proceso Enteros_desde

Proceso cribar

2Primos

ListaEnteros

Page 20: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

20Diego Darío Guerrero Almudena Bocinos Riobóo

mode dueño(matrícula↑,dnipersona?).dueño(’BBT4567’,’48029184T’).dueño(‘CAB2005’,’21259337E’).dueño(‘CEY9200’,’55621832M’).

mode multa(matrícula?,importe↑).multa(’BBT4567’,’180€’).multa(‘CAB2005’,’500€’).multa(‘CEY9200’,’300€’).

Ejemplo de Variable Compartida

<-Y:dueño(matricula,’48029184T’),

multa(matricula, Y). Y=180€

succeeded

Variable Compartida

Page 21: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

21Diego Darío Guerrero Almudena Bocinos Riobóo

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.

EXPRESAR CONCURRENCIA

Page 22: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

22Diego Darío Guerrero Almudena Bocinos Riobóo

BASES DE DATOS. Solución a Incompletitud

database pred/Aridad.

pred(uno1, dos1,… A).

pred(uno2, dos2,… A).

Otra solución más elaborada consiste en utilizar las capacidades de Bases de Datos que proporciona Parlog.

Sobre esta definición, (que puede almacenarse en ficheros), podemos realizar consultas con set/3 y subset/3.

Page 23: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

23Diego Darío Guerrero Almudena Bocinos Riobóo

BASES DE DATOS

database amig/2.

amig(pepe,miguel).

amig(javier,jesus).

amig(pepe,antonio).

amig(paco,maria).

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.

<- R: set(R,X,amig(pepe,X)). resultado:

R=[miguel,antonio].

Page 24: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

24Diego Darío Guerrero Almudena Bocinos Riobóo

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.

PRIMITIVAS DE PARLOG

Parlog proporciona un gran surtido de primitivas, entre las que podemos encontrar:

Page 25: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

25Diego Darío Guerrero Almudena Bocinos Riobóo

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.

Page 26: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

26Diego Darío Guerrero Almudena Bocinos Riobóo

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.

PRIMITIVAS DE LECTURA

Page 27: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

27Diego Darío Guerrero Almudena Bocinos Riobóo

Una mezcla de las dos nos proporciona un “read” que es capaz de no bloquear todos los procesos:

PRIMITIVAS DE LECTURA

mode achars(caracteres^).

achars([Char|Chars]) <-key(Char) &achars(Chars).

mode schars(caracteres^).

schars([Char|Chars]) <-getkey(Char) &schars(Chars).

Síncrona (bloquea) Asíncrona (no bloquea)

Page 28: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

28Diego Darío Guerrero Almudena Bocinos Riobóo

Ahora veremos algunos ejemplos completos en el entorno ParlogW:

Representación y búsqueda en árboles.

Ordenación QuickSort de listas.

EJEMPLOS EN PARLOGW

Page 29: 1 Diego Darío Guerrero Almudena Bocinos Riobóo Almudena Bocinos Riobóo. Diego Darío Guerrero Fernández

29Diego Darío Guerrero Almudena Bocinos Riobóo

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.

BIBLIOGRAFIA y MATERIAL