---
tags: mp, WCh
---
# Lista 5
Formuły:
```racket=
(define (var? t)
(symbol? t))
(define (neg? t)
(and (list? t)
(= 2 (length t))
(eq? 'neg (car t))))
(define (conj? t)
(and (list? t)
(= 3 (length t))
(eq? 'conj (car t))))
(define (disj? t)
(and (list? t)
(= 3 (length t))
(eq? 'disj (car t))))
(define (prop? f)
(or (var? f)
(and (neg? f)
(prop? (neg-subf f)))
(and (disj? f)
(prop? (disj-left f))
(prop? (disj-rght f)))
(and (conj? f)
(prop? (conj-left f))
(prop? (conj-rght f)))))
```
## Ćwiczenie 1
```racket=
(define (make-neg f)
(list 'neg f))
(define (make-conj l r)
(list 'conj l r))
(define (make-disj l r)
(list 'disj l r))
(define (neg-subf f)
(second f))
(define (conj-left f)
(second f))
(define (conj-rght f)
(third f))
(define (disj-left f)
(second f))
(define (disj-rght f)
(third f))
(define tauthology (make-disj 'p (make-neg 'p)))
(define some-formula (make-conj 'p 'q))
```
## Ćwiczenie 2
Indukcja po podformułach.
```
(define (prop? f)
(or (var? f)
(and (neg? f)
(prop? (neg-subf f)))
(and (disj? f)
(prop? (disj-left f))
(prop? (disj-rght f)))
(and (conj? f)
(prop? (conj-left f))
(prop? (conj-rght f)))))
```
Zasada indukcji. Dla dowolnej własności P, jeśli:
```
* dla każdego symbolu x zachodzi P(x),
* dla dowolnej formuły f, jeśli zachodzi P(f), to zachodzi P((neg f)) i
* dla dowolnych formuł f1, f2, jeśli zachodzi P(f1) i P(f2), to zachodzi również P((conj f1 f2)) i P((disj f1 f2))
```
to dla dowolnej formuły f, jeśli zachodzi (prop? f), to zachodzi P(f).
## Ćwiczenie 3
```racket=
(define (free-vars f)
(define (go f)
(cond ((var? f)
(list f))
((neg? f)
(go (neg-subf f)))
((disj? f)
(append (go (disj-left f))
(go (disj-rght f))))
((conj? f)
(append (go (conj-left f))
(go (conj-rght f))))))
(remove-duplicates (go f)))
(free-vars tauthology)
(free-vars some-formula)
```
## Ćwiczenie 4
```racket=
(define (gen-vals xs)
(if (null? xs)
(list null)
(let*
((vss (gen-vals (cdr xs)))
(x (car xs))
(vst (map (lambda (vs) (cons (list x true) vs)) vss))
(vsf (map (lambda (vs) (cons (list x false) vs)) vss)))
(append vst vsf))))
(define (eval-formula f v)
(cond
((var? f) (second (assoc f v)))
((neg? f) (not (eval-formula (neg-subf f) v)))
((conj? f) (and
(eval-formula (conj-left f) v)
(eval-formula (conj-rght f) v)))
((disj? f) (or
(eval-formula (disj-left f) v)
(eval-formula (disj-rght f) v)))
))
; (define second cadr)
; (define (cadr x) (car (cdr x)))
; (define head car)
; (define tail cdr)
(define (falsifiable-eval? f)
(define (is-false v)
(not (eval-formula f v)))
(let* [
(vars (free-vars f))
(all-vals (gen-vals vars))
(false-vals (filter is-false all-vals))
]
(if (= (length false-vals) 0)
false
(first false-vals))))
(define (falsifiable-eval2? f)
(define (is-false v)
(if (not (eval-formula f v))
v
false))
(let* [
(vars (free-vars f))
(all-vals (gen-vals vars))
]
(ormap is-false all-vals)))
(define (falsifiable-eval3? f)
(define (is-true v)
(eval-formula f v))
(let* [
(vars (free-vars f))
(all-vals (gen-vals vars))
(false-vals (dropf all-vals is-true))
]
(if (= (length false-vals) 0)
false
(first false-vals))))
(falsifiable-eval? some-formula)
```
## Ćwiczenie 5
```racket=
(define (nnf? f)
(or (var? f)
(and (neg? f)
(var? (neg-subf f)))
(and (disj? f)
(nnf? (disj-left f))
(nnf? (disj-rght f)))
(and (conj? f)
(nnf? (conj-left f))
(nnf? (conj-rght f)))))
;; (make-literal false p) - zanegowane p, wpp niezanegowane
(define (make-literal b p)
(list 'literal b p))
(define (literal? f)
(and (= 3 (length f))
(eq? 'literal (first f))
(boolean? (second f))
(var? (third f))))
(define (literal-positive? f)
(second f))
(define (literal-var f)
(third f))
(define (nnf? f)
(or (var? f)
(literal? f)
(and (disj? f)
(nnf? (disj-left f))
(nnf? (disj-rght f)))
(and (conj? f)
(nnf? (conj-left f))
(nnf? (conj-rght f)))))
(define (free-vars-nnf f)
(define (go f)
(cond ((var? f)
(list f))
((literal? f)
(list (literal-var f)))
((neg? f)
(go (neg-subf f)))
((disj? f)
(append (go (disj-left f))
(go (disj-rght f))))
((conj? f)
(append (go (conj-left f))
(go (conj-rght f))))))
(remove-duplicates (go f)))
(define (eval-formula-nnf f v)
(cond
((var? f) (second (assoc f v)))
((literal? f)
(let ((var-val (second (assoc (literal-var f)) v)))
(if (literal-positive? f)
var-val
(not var-val))))
((neg? f) (not (eval-formula-nnf (neg-subf f) v)))
((conj? f) (and
(eval-formula-nnf (conj-left f) v)
(eval-formula-nnf (conj-rght f) v)))
((disj? f) (or
(eval-formula-nnf (disj-left f) v)
(eval-formula-nnf (disj-rght f) v)))
))
(define definitely-false (make-conj 'p (make-literal false 'p)))
(define tauthology-nnf (make-disj 'p (make-literal false 'p)))
```
## Ćwiczenie 6
```racket=
; zbiór zadań z logiki s. 35 (rysunek 5.)
(define (convert-to-nnf f)
(define (T f)
(cond
[(var? f) (make-literal true f)]
[(neg? f) (F (neg-subf f))]
[(conj? f) (make-conj
(T (conj-left f))
(T (conj-rght f)))]
[(disj? f) (make-disj
(T (disj-left f))
(T (disj-rght f)))]
)
)
(define (F f)
(cond
[(var? f) (make-literal false f)]
[(neg? f) (T (neg-subf f))]
[(conj? f) (make-disj
(F (conj-left f))
(F (conj-rght f)))]
[(disj? f) (make-conj
(F (disj-left f))
(F (disj-rght f)))]
)
)
(T f)
)
(define in-nnf (convert-to-nnf (make-neg (make-disj 'p 'q))))
(nnf? in-nnf)
```
## Ćwiczenie 7
Zestaw równoważności:
(neg-subf (make-neg p)) = p
(conj-left (make-conj p q)) = p
(conj-rght (make-conj p q)) = q
(disj-left (make-disj p q)) = p
(disj-rght (make-disj p q)) = q
P(f) ≡ (nnf? (convert-to-nnf f)) = true
Zasada indukcji. Dla dowolnej własności P, jeśli:
dla każdego symbolu x zachodzi P(x),
dla dowolnej formuły f, jeśli zachodzi P(f), to zachodzi P((neg f)) i
dla dowolnych formuł f1, f2, jeśli zachodzi P(f1) i P(f2), to zachodzi również P((conj f1 f2)) i P((disj f1 f2))
to dla dowolnej formuły f, jeśli zachodzi (prop? f), to zachodzi P(f).
```
(define (T f)
(cond
[(var? f) (make-literal true f)]
[(neg? f) (F (neg-subf f))]
[(conj? f) (make-conj
(T (conj-left f))
(T (conj-rght f)))]
[(disj? f) (make-disj
(T (disj-left f))
(T (disj-rght f)))]
)
)
(define (F f)
(cond
[(var? f) (make-literal false f)]
[(neg? f) (T (neg-subf f))]
[(conj? f) (make-disj
(F (conj-left f))
(F (conj-rght f)))]
[(disj? f) (make-conj
(F (disj-left f))
(F (disj-rght f)))]
)
)
;; Silniejsza własność P
P(f) ≡ (nnf? (T f)) i (nnf? (F f))
Weźmy dowolny symbol x. Pokażmy, że P(x):
L - lewa strona
L ≡ (nnf? (T x)) ≡ (nnf? (make-literal true x)) ≡ true
P ≡ (nnf? (F x)) ≡ (nnf? (make-literal false x)) ≡ true
Weźmy dowolną formułę f i załóżmy, że P(f). Pokażmy, że P(not f):
L ≡ (nnf? (T (make-neg f))) ≡ (nnf? (F f)) ≡ true
P ≡ (nnf? (F (make-neg f))) ≡ (nnf? (T f)) ≡ true
Weźmy dowolne formuły f1, f2 i załóżmy, że P(f1) i P(f2). Pokażmy, że:
a) P(conj f1 f2)
L ≡ (nnf? (T (make-conj f1 f2))) ≡ (nnf? (make-conj (T f1) (T f2))
≡ (and (nnf? (T f1)) (nnf? (T f2))) ≡ true
Dla prawej strony tak samo
b) P(disj f1 f2)
Analogicznie
Zatem na mocy zasady o indukcji, P(f) zachodzi dla dowolnej formuły f (czyli (T f) zamienia dowolną formułę na nnf)
Skoro (convert-to-nnf f) ≡ (T f), to udowodniliśmy, że procedura convert-to-nnf zamienia dowolną formułę f na nnf.
```
## Ćwiczenie 8
zabrakło nam na to czasu