tarefa2.md 3.21 KB

Tarefa 2: Ler Redes Bayesianas, Escrever Programas Lógicos

Estado da Tarefa. Importação de Redes Bayesianas - OK; Construção de Programa Lógico a Partir de uma RB - Em Curso.

Importar uma Rede Bayesiana

Passos:

  • [x] Implementar
  • [ ] Testar e Documentar
  • [x] Usar

Função summary_dag(filename) no módulo bninput. Deve ser testada e documentada.

Construir um Programa Lógico dada uma Rede Bayesiana

Passos:

  • [/] Implementar
  • [ ] Testar e Documentar
  • [ ] Usar

2023-07-20

O ficheiro tarefa2.py está quase adequado para esta tarefa. Em particular, tem código para converter a descrição de uma bn em algo que se assemelha a um programa lógico. No entanto:

Criar funções. À semelhança do que fez no bninput, deve colocar o código "essencial" em funções. Isto é, o essencial de

if __name__ == "__main__":
    summary = summary_dag("asia2.bif")
    model = summary["bnmodel"]
    probabilities = get_yes_probabilities(model)
    for node, yes_prob in probabilities.items():
        parents = model.get_parents(node)
        s = ""
        if len(parents) == 0:
...

deve ir para uma função. A minha sugestão é que o argumento dessa função seja um model que poderá resultar de, por exemplo, summary_dag(...).

Adaptar a notação dos programas lógicos.

A sintaxe para os programas lógicos é a seguinte:

f.                  /* Facto Determinista */
h :- b1, ..., bN.   /* Regra Determinista */
p::f.               /* Facto Probabilístico */
p::h :- b1, ..., bN./* Regra Probabilística */

em que p é uma probabilidade (um float entre 0 e 1); f é um "facto" (por exemplo, asia) e h :- b1, ..., bN é uma "regra" em que h é a "cabeça" ("head") e o "corpo" ("body") tem "literais" (factos ou negações de factos) b1, ..., bN. O símbolo "," denota a conjunção ($\wedge$), "-" a negação ($\neg$) e ":-" (em vez de "<-", e lê-se "if" ou "se") denota $\leftarrow$.

Além disso, em relação ao que o seu programa produz, cada regra e cada facto termina em ".". Portanto, falta acertar a sintaxe com a dos programas lógicos.

Sintaxe, parte 2

Há, ainda, um aspeto adicional: Os programas que processam os programas lógicos não suportam (mais ou menos, em geral, por enquanto) factos e regras probabilísticas. Isso significa que a sintaxe

p::f.               /* Facto Probabilístico */
p::h :- b1, ..., bN./* Regra Probabilística */

está "errada" para esses programas. O que podemos fazer, por enquanto, é escrever

%* p::f. *% 
f ; -f. 
%* p::h. *% 
h ; -h :- b1, ..., bN.

Por exemplo,

%* 0.01::asia. *%
asia ; -asia.

em vez de

0.01::asia.

Nestes exemplos a sintaxe dos programas lógicos está acrescentada com ";" para denotar a disjunção ($\vee$) e "%* ... *%" para blocos de comentários. Isto é,

%* 0.01::asia. *%
asia ; -asia.

diz que temos um facto disjuntivo, asia ; -asia que indica que ou "acontece" asia ou "acontece" não asia. O comentário %* 0.01::asia. *% serve para "transportar" a informação sobre as probabilidades. Esta informação será tratada posteriormente, talvez na tarefa 4 ou na 5.