Blame view

students/amartins/tarefas/tarefa2.md 3.21 KB
652cc0d6   Francisco Coelho   updated amartins ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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:

3e0f9b8a   Francisco Coelho   back to work?
19
- [/] Implementar
652cc0d6   Francisco Coelho   updated amartins ...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
- [ ] 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

```python
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:
```prolog
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
```prolog
p::f.               /* Facto Probabilístico */
p::h :- b1, ..., bN./* Regra Probabilística */
```
está "errada" para esses programas. O que podemos fazer, por enquanto, é escrever
```prolog
%* p::f. *% 
f ; -f. 
%* p::h. *% 
h ; -h :- b1, ..., bN.
``` 

Por exemplo, 
```prolog
%* 0.01::asia. *%
asia ; -asia.
```
em vez de
```prolog
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 é,
```prolog
%* 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.