![Page 1: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/1.jpg)
Práctica II
Prolog II: Meta Intérprete Vanilla
![Page 2: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/2.jpg)
2
Contenido
1. Meta intérpretes.
2. Meta intérprete vanilla para cláusulas definidas.
3. Extensión vanilla predicados predefinidos.
4. Extensión vanilla pruebas.
5. Modificación del lenguaje base.
6. Ejercicios.
![Page 3: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/3.jpg)
1. Meta intérpretes
3
![Page 4: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/4.jpg)
4
Meta intérprete
Intérprete de un lenguaje escrito en el propio lenguaje
Interés
Acceso al proceso de cómputo del lenguaje
Desarrollo de entornos de programación integrados
![Page 5: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/5.jpg)
5
Meta intérprete más sencillo
solve(A):- call(A).
O bien:
solve(A):-A.
Sin interés, pues no permite acceder a los elementos del proceso de cómputo.
Más interesante: hacer explícita la regla de cómputo y la regla de búsqueda
![Page 6: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/6.jpg)
2. Meta interpreta vanilla para cláusulas definidas
6
![Page 7: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/7.jpg)
7
Meta intérprete vanilla (I)
solve(true). solve((A,B)) :- solve(A), solve(B). solve(A) :- clause(A, B), solve(B).
Lectura Declarativa
La meta vacía es cierta. la meta conjuntiva (A, B) es cierta si A es cierta y B es
cierta. La meta A es cierta si existe una cláusula A:-B y B es
cierta.
![Page 8: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/8.jpg)
8
Meta intérprete vanilla (II)
solve(true). solve((A,B)) :- solve(A), solve(B). solve(A) :- clause(A, B), solve(B).
Lectura Operacional La meta vacía está resuelta. Para resolver la meta (A, B) resolver primero A y después
B (Regla de cómputo). Para resolver la meta A, seleccionar una cláusula cuya
cabeza unifique con A y resolver el cuerpo, usando la regla de búsqueda de Prolog.
![Page 9: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/9.jpg)
9
Meta intérprete vanilla (III)
Mejor: solve(true):-!. solve((A,B)) :-!, solve(A), solve(B). solve(A) :- clause(A, B), solve(B).
¿Por qué?
![Page 10: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/10.jpg)
10
Meta intérprete vanilla (IV)
solve(true):-!. solve((A,B)) :-!, solve(A), solve(B). solve(A) :- clause(A, B), solve(B).
Limitado a Prolog “puro”: Sin modificación de la reevaluación: corte, fail, repeat... Sin negación por fallo (programas definidos). Sin asociación de procedimientos: predicados predefinidos.
![Page 11: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/11.jpg)
Ejemplo base de conocimiento “propagación señal ”
valor(w1, 1).
conectado(w2, w1).
conectado(w3, w2).
valor(W,X):-conectado(W,V), valor(V,X).
1 ?- solve(valor(W,X)).
W = w1,
X = 1 ;
W = w2,
X = 1 ;
W = w3,
X = 1 ;
false.
11
solve(true):-!. solve((A,B)) :-!, solve(A), solve(B). solve(A) :- clause(A, B), solve(B).
![Page 12: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/12.jpg)
3. Extensión vanilla predicados predefinidos
12
![Page 13: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/13.jpg)
13
Extensión vanilla con predicados predefinidos
builtin(A is B). builtin(A > B). builtin(A < B).
builtin(A = B). builtin(A =:= B). builtin(A =< B).
builtin(A >= B). builtin(functor(T, F, N)).
builtin(read(X)). builtin(write(X)).
solve(true):- !.
solve((A,B)) :-!, solve(A), solve(B).
solve(A):- builtin(A), !, A.
solve(A) :- clause(A, B), solve(B).
![Page 14: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/14.jpg)
Ejemplo predefinidos
1 ?- solve(write('¡¡¡Esto funciona!!!')).
¡¡¡Esto funciona!!!
true.
14
![Page 15: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/15.jpg)
4. Extensión vanilla pruebas
15
![Page 16: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/16.jpg)
16
Extensión “vanilla” pruebas
builtin(A is B). builtin(A > B). builtin(A < B). builtin(A = B). builtin(A =:= B). builtin(A =< B). builtin(A >= B). builtin(functor(T, F, N)). builtin(read(X)). builtin(write(X)). solve(true,true) :- !. solve((A, B), (ProofA, ProofB)) :- !, solve(A, ProofA), solve(B, ProofB). solve(A, (A:-builtin)):- builtin(A), !, A. solve(A, (A:-Proof)) :- clause(A, B), solve(B, Proof).
![Page 17: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/17.jpg)
Prueba propagación señal
1 ?- solve(valor(w1,X),Prueba).
X = 1,
Prueba = (valor(w1, 1):-true) .
2 ?- solve(valor(w2,X),Prueba).
X = 1,
Prueba = (valor(w2, 1):- (conectado(w2, w1):-true), (valor(w1, 1):-true)) .
3 ?- solve(valor(w3,X),Prueba).
X = 1,
Prueba = (valor(w3, 1):- (conectado(w3, w2):-true), (valor(w2, 1):- (conectado(w2, w1):-true), (valor(w1, 1):-true))) .
17
![Page 18: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/18.jpg)
5. Modificación lenguaje base
Lenguaje base: expresiones que pueden ser manejadas por el meta intérprete
Metalenguaje: lenguaje del intérprete
Hasta ahora, el mismo
Cláusulas definidas
Predicados predefinidos interpretados “como” en Prolog
Modificaremos el lenguaje base
Separar claramente ambos
Sintactic sugaring
18
![Page 19: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/19.jpg)
Ejemplo base de conocimiento “propagación señal ”
true ---> valor(w1, 1).
true ---> conectado(w2, w1).
true ---> conectado(w3, w2).
conectado(W,V) & valor(V,X) ---> valor(W,X).
Necesitamos definir ---> y & como operadores Prolog:
:-op(40, xfy, &).
:-op(50, xfy, --->).
19
![Page 20: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/20.jpg)
Ligera modificación del meta intérprete
:-op(40, xfy, &).
:-op(50, xfy, --->).
solve(true):-!.
solve((A & B)) :-!, solve(A), solve(B).
LA ULTIMA CLÁUSULA
Ver ejercicio 4
20
![Page 21: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/21.jpg)
Dominio: asistente al diagnóstico
21
David Poole, Alan Mackworth. Artificial Intelligence: Foundations of Computational Agents, Cambridge University Press, 2010
![Page 22: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/22.jpg)
Modelar el dominio en el lenguaje base
Si una bombilla funciona correctamente y le llega tensión, entonces se enciende:
light(L)&
ok(L)&
live(L)
---> lit(L).
22
![Page 23: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/23.jpg)
Modelar el dominio
Si un cable está conectado a otro al que le llega tensión, entonces tiene tensión:
connected_to(W,W1)&
live(W1)
---> live(W).
23
![Page 24: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/24.jpg)
Modelar el dominio
El cable externo tiene tensión:
true ---> live(outside).
l1 es una bombilla:
true ---> light(l1).
El interruptor s1 está abierto:
true ---> down(s1).
El interruptor s2 está cerrado:
true ---> up(s2).
24
![Page 25: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/25.jpg)
Modelar el dominio
Si el interruptor s2 está abierto y funciona correctamente entonces el cable w0 está conectado al cable w1:
up(s2) & ok(s2) ---> connected_to(w0,w1).
Si el diferencial cb2 funciona correctamente entonces el cable w6 está conectado al cable w5:
ok(cb2) ---> connected_to(w6,w5).
El enchufe p2 está conectado al cable w6:
true ---> connected_to(p2,w6).
25
![Page 26: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/26.jpg)
Ejercicios (I)
1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal a la derecha”.
2. Modificar el meta intérprete vanilla para obtener un intérprete que realice una búsqueda en profundidad limitada. La profundidad máxima será un argumento adicional que se instanciará en la llamada.
3. Modificar el meta intérprete vanilla para obtener un intérprete que muestre la traza de las metas que va resolviendo, mostrando el nivel de las mismas. Por ejemplo:
26
![Page 27: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/27.jpg)
Ejercicios (II)
1 ?- solve_traza(valor(w3,X)).
0 valor(w3,_G374)
1 conectado(w3,w2)
1 valor(w2,_G374)
2 conectado(w2,w1)
2 valor(w1,1)
X = 1 ;
2 valor(w1,_G374)
false.
27
![Page 28: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/28.jpg)
Ejercicios (III)
4. Modificar el meta intérprete vanilla para que acepte el nuevo lenguaje base.
5. Completar la base de conocimiento que modela el ejemplo de asistente al diagnóstico propuesto por Poole y Mackworth.
6. Modificar el meta intérprete vanilla que genera pruebas para que acepte el nuevo lenguaje base y obtener la prueba de lit(l2).
(sugerencia: construir la prueba de «B ---> A» mediante «A por Prueba», siendo Prueba la prueba de B, definiendo el operador :-op(40, xfy, por). )
28
![Page 29: Práctica II - UVacalonso/Ingenieria Conocimiento-Grado... · 1. Modificar el meta intérprete vanilla para obtener un intérprete que utilice como regla de cómputo “1er literal](https://reader033.vdocumento.com/reader033/viewer/2022042805/5f65c12ac9825574f7196bfe/html5/thumbnails/29.jpg)
Bibliografía
David Poole, Alan Mackworth. Artificial Intelligence: Foundations of Computational Agents, Cambridge University Press, 2010.
Disponible en http://artint.info/html/ArtInt.html
29