Basta con hacer lo siguiente:
Inference (opción por defecto).Evaluate.Python en nuestro equipo, para instalar problog vamos a un terminal y escribimos:
Si tiene algún problema con la instalación, consulte las secciones dedicadas a tal efecto.
problog, así como el paquete de Python para poder llamarlo desde el código. Pruébelo tecleando problog --version en el terminal…
2.1.0.39), ya vemos que la instalación ha tenido éxito y que además el programa está correctamente instalado en el PATH del sistema operativo, de modo que deberá funcionar al lanzarlo desde cualquier carpeta de nuestro equipo.Si al haber intentado instalar problog nos ha dado un error indicado que no se encuentra o no se reconoce el comando pip, es posible que o bien no tengamos instalado Python o bien no esté accesible en el PATH del sistema. Según el caso en el que se encuentre, acceda a la sección de este documento que corresponda, pues trataremos de guiarlo para solucionar cualquiera de las dos situaciones.
Si no tiene instalado Python en su equipo, puede instalarlo desde este enlace, o bien si quiere añadir otras herramientas asociados puede instalar la distribución Anaconda. Si tiene problemas con la instalación puede ponerse en contacto con los profesores de la asignatura.
Si suele trabajar con un equipo Unix o Mac, lo normal es que ya tengan instalado Python y añadido al PATH del sistema operativo, por lo que nos centramos en el caso de Windows. En este enlace se explica cómo añadir Python al PATH de Windows. La ruta específica dependerá de su instalación.
Además de Python, es conveniente añadir al Path explícitamente la carpeta Scripts que encontrará dentro de la propia carpeta de Python. Siga el mismo proceso indicado en el enlace, pero para añadir también la ruta incluyendo al final "/Scripts".
En cualquier caso, si tiene problemas para encontrar su instalación de Python y añadirla al PATH puede ponerse en contacto con los profesores de la asignatura.
Tomemos como referencia un ejemplo sencillo de sistema basado en reglas, como el que vemos en la sección que acompaña.
A continuación indicamos los usos básicos de ProbLog para trabajar con este ejemplo, que incluyen:
A las preguntas planteadas, el sistema deberá responder como se muestra en los árboles de resolución mostrados.
Basta con acudir al editor online, introducir el código correspondiente en el área de texto, dejar la opción Inference seleccionada en el desplegable de la derecha y lanzar la evaluación de las consultas planteadas al sistema mediante Evaluate.
En este enlace puede ver el ejemplo en cuestión, listo para probarlo.
Si tenemos instalado ProbLog instalado en nuestro equipo, podemos escribir nuestra base de conocimientos (BC) en un fichero y pasarlo a problog como parámetro del comando. Basta con escribir en el terminal, asumiendo la existencia del fichero ejemplo_simple.pl en la ruta indicada::
Esta salida nos indica, como en el caso online, que a la luz de los hechos, tenemos que se cumple s(b) y no se cumple s(a).
Desde el terminal podemos abrir una shell de problog:
C:\Users\...\Tema2>problog shell
% Welcome to ProbLog 2.1 (version 2.1.0.39)
% Type 'help.' for more information.
?-
El signo de interrogación nos indica que está esperando que demos órdenes al núcleo de blog. Aquí podremos cargar una base de conocimientos (usando consult) y hacer las preguntas que requiramos (usando query):
Como vemos, el mismo resultado anterior se sigue manteniendo.
Podemos lanzar igualmente el proceso sobre la base de conocimiento, empleando el motor de inferencia de ProbLog, a través de la llamada desde código Python como el siguiente:
from problog.program import PrologString
from problog.core import ProbLog
from problog import get_evaluatable
p = PrologString("""
s(X) :- q(X), \+r(X).
q(X) :- p(X).
p(a).
p(b).
r(a).
query(s(a)).
query(s(b)).
""")
r = get_evaluatable().create_from(p).evaluate()
print(r)Puede escribir este fragmento de código Python en un fichero ejemplo_simple.py y lanzarlo desde el terminal:
Como vemos, el resultado es el mismo que en los casos anteriores, confirmándonos que el predicado s se cumple sobre b, pero no así sobre a. Comprobamos así que todos estos métodos estarán a nuestro alcance, para distintos uso pero siempre empleando el mismo núcleo y obteniendo, por tanto, el mismo resultado.
Sea el siguiente ejemplo simple de base de conocimiento:
s(X) :- q(X), \+r(X).
q(X) :- p(X).
p(a).
p(b).
r(a).
query(s(a)).
query(s(b)).
El sistema establece un par de reglas involucrando a los predicados p, q, r y s , junto con una variable X. Los hechos que suceden a las mismas incorporan constantes a y b. Finalmente, se plantean al sistema dos consultas, para valorar si en vista de los hechos se puede concluir s(a) y/o s(b).
Nota: el símbolo \+ establece la negación del término al que antecede.
% Estableciendo relaciones entre conceptos, datos...
%%% HECHOS
docente(marta). % Marta es docente
docente(laura). % Laura es docente
docente(miguel). % Miguel es docente
estudiante(paco). % Paco es estudiante
estudiante(susana). % Paco es estudiante
estudiante(raquel). % Paco es estudiante
asignatura(satd). % SATD es una asignatura
matriculado(paco,satd). % Paco se ha matriculado en SATD.
matriculado(raquel,satd). % Susana se ha matriculado en SATD.
imparte(marta,satd). % Marta imparte la asignatura SATD.
imparte(miguel,satd). % Miguel también imparte la asignatura SATD.
%%% REGLAS
% Sabiendo quién imparte cada asignatura y quién está matriculado,
% podremos deducir la asociación entre profesores y alumnos,
% asumiendo que existe únicamente un grupo.
da_clase(Prof,Estud) :- docente(Prof), estudiante(Estud),
asignatura(X), matriculado(Estud,X), imparte(Prof,X).
% La regla nos dice literalmente:
% "Si Prof es un docente, Estud es un estudiante, y existe una asignatura X
% tal que Estud la estudia y Prof la imparte, entonces sabemos que
% Prof da clase a Estud."
% A partir de lo anterior, podemos preguntar al sistema quién da clase a quién:
query(da_clase(X,Y)).
% Al pasarle las variables X e Y, el sistema devolverá todas las parejas X e Y
% tales que X da clase a Y.
% De forma similar, si dos estudiantes están matriculados en la misma asignatura
% podemos decir que comparten clase:
comparten_clase(Estud1,Estud2) :- asignatura(X), matriculado(Estud1,X), matriculado(Estud2, X).
% Veamos qué compañeros/as tiene Raquel:
query(comparten_clase(raquel,Comp)).
% En una determinada cafetería vegetariana hay tres posibles desayunos:
% café (1 euro), café y media (1.70), o café con media y zumo (2.20).
desayuno(nada).
desayuno(cafe).
desayuno(cafeymedia).
desayuno(cafeconmediayzumo).
cuesta(nada,0).
cuesta(cafe,1).
cuesta(cafeymedia,1.70).
cuesta(cafeconmediayzumo,2.20).
% Para que una determinada persona pueda comprar un desayuno,
% debe contar con saldo suficiente para pagarlo (mayor o igual a su coste)
puededesayunar(Pers,D) :- saldo(Pers,X), desayuno(D), cuesta(D,Y), X >= Y.
% Literalmente:
% si una persona Pers tiene un saldo X, hay un desayuno D que cuesta Y,
% y X es mayor que Y, entonces Pers puede comprar Y.
% Hemos necesitado un operador de comparación (X>=Y), sobre dos elementos
% previamente sustituidos en las relaciones anteriores.
% Luis tiene 2 euros
saldo(luis,2).
% ¿Qué puede comprar Luis?
query(puededesayunar(luis,Art)).
% Además, podemos enriquecer la regla anterior, en caso de estar interesados
% en saber con cuánto dinero nos quedaríamos según lo que compremos.
% María tiene 6.5 euros:
saldo(maria,6.5).
% ¿Qué puede desayunar María?
%query(puededesayunar(maria,Art)).
% Creamos la regla que a lavez compruebe si podemos comprar un producto y
% nos diga lo que nos queda si lo compramos.
quedariasicompra(Pers,D,Restante) :-
saldo(Pers,X), desayuno(D), cuesta(D,Y), X >= Y, Restante is X-Y.
% Como podemos observar en la regla, para ver lo que nos quedaría
% necesitamos ver que podemos comprarlo (comparación), y además calcular
% la diferencia del saldo acual y lo que cuesta el producto. Esto me lleva
% a un pequeño cálculo aritmético (X-Y) y una asignación (Restante is X-Y).
%¿Cuánto le quedaría a María si compra el desayuno com zumo?
% Vaya descomentando y comentando las preguntas que quiera lanzar
%query(quedariasicompra(maria,cafeconmediayzumo,Queda)).
%¿Y si prescinde del zumo?
%query(quedariasicompra(maria,cafeymedia,Queda)).
% La comida de menú cuesta 4.5 euros...
comida(menu).
cuesta(menu,4.5).
% Una persona podrá comer una determinada comida,
% si tras el desayuno le ha quedado bastante dinero,
% y desde luego no desayunar no será una opción,
% ¡que hay que tirar el resto del día!
puedecomer(Pers,Des,Com,Sobra) :-
saldo(Pers,X), quedariasicompra(Pers,Des,Queda), Des \= nada,
comida(Com), cuesta(Com,Precio), Queda >= Precio,
Sobra is Queda - Precio.
% ¿Qué puede hacer María para desayunar y comer con el saldo que ha traído?
% ¿Le sobrará algo?
%query(puedecomer(maria,Des,Com,Sobra)).
En este enlace encontrará un primer ejemplo de una base de conocimiento basada en reglas haciendo uso de ProbLog.
En la misma puede distinguir varios elementos a destacar:
Paciente tiene una serie de síntomas es posible que ese Paciente tenga la enfermedad indicada en la regla.Puede ver el código correspondiente en la sección Base de conocimiento que acompaña a esta pestaña. Como observará, los elementos esenciales que encontramos son:
sintoma e hipotesis.maria y antonio, al tratarse de constantes, valores específicos.)Paciente, que presente cierto conjunto de síntomas, que lleven a concluir como posibilidad un cierto conjunto de hipótesis; las otras dos, más que parte de la base de conocimientos, forman parte de la consulta a realizar, de modo que la variable Enfermedad1 pueda devolvernos un valor para cada posible enfermedad como diagnóstico tentativo de Antonio, y de forma equivalente con Enfermedad2 para María.Podemos lanzarlo desde cualquiera de los métodos que hemos visto en la sección de Primer uso. En cualquiera de los casos, como vemos en la imagen, obtenemos como posibles diagnósticos para Antonio la varicela y la rubeola y para María las paperas.
En el ejemplo inicial tenemos en el mismo archivo tres elementos distintos:
Parece que una aproximación más realista sería contar con una base de conocimiento general, como la que se puede observar en la sección Mejora, y dada la presencia de un paciente concreto en consulta que ha llegado con unas evidencias determinadas (por ejemplo, María), se pueda introducir esa evidencia y posteriormente pedir al sistema hipótesis, sugerencias de diagnóstico.
Eche un vistazo a esta sesión con el shell de problog:
?- consult('Ej02/kb_sintoma_enfermedad_2.pl').
?- query(hipotesis(maria,Enf)).
No clauses found for 'sintoma/2' at 2:5 in .\Ej02/kb_sintoma_enfermedad_2.pl.
?- use_module(library(assert)).
?- assertz(sintoma(maria,ganglios_inflamados)), assertz(sintoma(maria,fiebre)).
p: 1.0;
---------------
?- assertz(sintoma(maria,malestar_general)), assertz(sintoma(maria,dolor_de_cabeza)).
p: 1.0;
---------------
?- query(hipotesis(maria,Enf)).
hipotesis(maria,paperas): 1Como puede observar, tras cargar la base de conocimientos general, solicitamos hipótesis pero el sistema no encuentra ninguna evidencia para comenzar a trabajar, ningún síntoma.
Ahora bien, podemos cargar el módulo assert, y posteriormente hacer uso del mismo, con su función assertz, para introducir los hechos relacionados con la evidencia concreta del paciente, en este caso María. Como vemos al final, nos plantea como hipótesis las paperas.
hipotesis(Paciente,sarampion) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,tos),
sintoma(Paciente,conjuntivitis),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,erupciones).
hipotesis(Paciente,rubeola) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,dolor_de_cabeza),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,erupciones).
hipotesis(Paciente,gripe) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,dolor_de_cabeza),
sintoma(Paciente,malestar_general),
sintoma(Paciente,conjuntivitis),
sintoma(Paciente,escalofrios),
sintoma(Paciente,dolor_de_garganta),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,tos).
hipotesis(Paciente,resfriado) :-
sintoma(Paciente,dolor_de_cabeza),
sintoma(Paciente,estornudos),
sintoma(Paciente,dolor_de_garganta),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,escalofrios).
hipotesis(Paciente,paperas) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,ganglios_inflamados).
hipotesis(Paciente,varicela) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,escalofrios),
sintoma(Paciente,malestar_general),
sintoma(Paciente,erupciones).
sintoma(antonio, fiebre).
sintoma(antonio, mocos).
sintoma(antonio, nariz_que_moquea).
sintoma(antonio, escalofrios).
sintoma(antonio, malestar_general).
sintoma(antonio, dolor_de_cabeza).
sintoma(antonio, erupciones).
sintoma(maria, ganglios_inflamados).
sintoma(maria, fiebre).
sintoma(maria, malestar_general).
sintoma(maria, dolor_de_cabeza).
query(hipotesis(antonio, Enfermedad1)).
query(hipotesis(maria, Enfermedad2)).
hipotesis(Paciente,sarampion) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,tos),
sintoma(Paciente,conjuntivitis),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,erupciones).
hipotesis(Paciente,rubeola) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,dolor_de_cabeza),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,erupciones).
hipotesis(Paciente,gripe) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,dolor_de_cabeza),
sintoma(Paciente,malestar_general),
sintoma(Paciente,conjuntivitis),
sintoma(Paciente,escalofrios),
sintoma(Paciente,dolor_de_garganta),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,tos).
hipotesis(Paciente,resfriado) :-
sintoma(Paciente,dolor_de_cabeza),
sintoma(Paciente,estornudos),
sintoma(Paciente,dolor_de_garganta),
sintoma(Paciente,nariz_que_moquea),
sintoma(Paciente,escalofrios).
hipotesis(Paciente,paperas) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,ganglios_inflamados).
hipotesis(Paciente,varicela) :-
sintoma(Paciente,fiebre),
sintoma(Paciente,escalofrios),
sintoma(Paciente,malestar_general),
sintoma(Paciente,erupciones).
En este enlace encontrará un primer uso de una red bayesiana haciendo uso de ProbLog.
En el mismo se representa el conocimiento de la red del ejemplo que encontramos en la diapositiva 39 de esta presentación.
Además, se incluyen aparte de la red dos evidencias y una pregunta. Más concretamente:
Es decir, se está solicitando al sistema calcular la probabilidad \(P(robo|juan, maria)\).
Pulsando en Evaluate, podrá comprobar que el sistema nos indica que existe una probabilidad de 0.284... de que efectivamente se trate de un robo.
0.001::burglary.
0.002::earthquake.
0.95::alarm :- burglary, earthquake.
0.94::alarm :- burglary, \+earthquake.
0.29::alarm :- \+burglary, earthquake.
0.001::alarm :- \+burglary, \+earthquake.
0.9::juan :- alarm.
0.05::juan :- \+alarm.
0.7::maria :- alarm.
0.01::maria :- \+alarm.
evidence(juan,true).
evidence(maria,true).
query(burglary).
Aquí vemos el código de la red, con cada una de las variables involucradas.
Al final del mismo se pueden ver además dos evidencias, indicando que tanto Juan como María han llamado.
A continuación, se solicita al sistema que calcule la probabilidad de que se haya producido un robo, teniendo en cuenta esta evidencia. Es decir, se pide: \(P(robo|juan, maria)\).