Advertisement
dgulczynski

MP5

Mar 20th, 2018
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.38 KB | None | 0 0
  1. #lang racket
  2. (define (var? t)
  3.   (symbol? t))
  4. (define (neg? t)
  5.   (and (list? t)
  6.        (= 2 (length t))
  7.        (eq? (quote neg) (car t))))
  8. (define (conj? t)
  9.   (and (list? t)
  10.        (= 3 (length t))
  11.        (eq? (quote conj) (car t))))
  12. (define (disj? t)
  13.   (and (list? t)
  14.        (= 3 (length t))
  15.        (eq? (quote disj) (car t))))
  16.  
  17. (define (prop? f)
  18.   (or (var? f)
  19.       (and (neg? f)
  20.            (prop? (neg-subf f)))
  21.       (and (disj? f)
  22.            (prop? (disj-left f))
  23.            (prop? (disj-rght f)))
  24.       (and (conj? f)
  25.            (prop? (conj-left f))
  26.            (prop? (conj-rght f)))))
  27.  
  28. (define (neg t)
  29.   (list (quote neg) t))
  30. (define neg-subf second)
  31.  
  32. (define (disj p q)
  33.   (list (quote disj) p q))
  34. (define disj-left cadr)
  35. (define disj-rght caddr)
  36.  
  37. (define (conj p q)
  38.   (list (quote conj) p q))
  39. (define conj-left cadr)
  40. (define conj-rght caddr)
  41.  
  42. (define (free-vars fs)
  43.   (define (iter f fs)
  44.     (cond [(neg? f)  (iter (neg-subf f)   fs)]
  45.           [(disj? f) (iter (disj-left f) (iter (disj-rght f) fs))]
  46.           [(conj? f) (iter (conj-left f) (iter (conj-rght f) fs))]
  47.           [(var? f)  (append (list f) fs) ]))
  48.   (remove-duplicates (iter fs null)))
  49.  
  50. ( define ( gen-vals xs )
  51.    (if ( null? xs )
  52.        ( list null )
  53.        ( let*
  54.             ((vss (gen-vals (cdr xs)))
  55.              (x (car xs))
  56.              (vst (map (lambda (vs) (cons (list x true) vs)) vss))
  57.              (vsf (map (lambda (vs) (cons (list x false) vs)) vss)))
  58.           (append vst vsf))))
  59.  
  60. (define (check x vs)
  61.   (cond [(null? vs) (error "Nie ma wartościowania dla podanej zmiennej")]
  62.         [(eq? x (caar vs)) (cadar vs)]
  63.         [else (check x (cdr vs))]))
  64.  
  65. (define (eval-formula f vs)
  66.   (cond [(neg? f)  (not (eval-formula (neg-subf f) vs))]
  67.         [(disj? f) (or  (eval-formula (disj-left f) vs) (eval-formula (disj-rght f) vs))]
  68.         [(conj? f) (and (eval-formula (conj-left f) vs) (eval-formula (conj-rght f) vs))]
  69.         [(var? f)  (check f vs)]))
  70.  
  71. (define (falsifiable-eval? f)
  72.   (define (helper vs)
  73.     (cond ((null? vs) false)
  74.           ((eval-formula f (car vs)) (helper (cdr vs)))
  75.           (else (car vs))))
  76.   (helper (gen-vals (free-vars f))))
  77.  
  78. ;; literał
  79. (define (lit var bool)
  80.   (list 'lit var bool))
  81. (define lit-bool third)
  82. (define lit-var second)
  83. (define (lit? l)
  84.   (and (= 3 (length l))
  85.        (eq? (first l) 'lit)
  86.        (var? (second l))
  87.        (boolean? (third l))))
  88.  
  89. (define (nnf-lit? f)
  90.   (cond [(disj? f) (and (nnf-lit? (disj-left f))
  91.                         (nnf-lit? (disj-rght f)))]
  92.         [(conj? f) (and (nnf-lit? (conj-left f))
  93.                         (nnf-lit? (conj-rght f)))]
  94.         [else (lit? f)]))
  95.  
  96. (define (eval-formula-lit f vs)
  97.   (cond [(disj? f) (or  (eval-formula-lit (disj-left f) vs) (eval-formula-lit (disj-rght f) vs))]
  98.         [(conj? f) (and (eval-formula-lit (conj-left f) vs) (eval-formula-lit (conj-rght f) vs))]
  99.         [(lit? f)  (eq? (lit-bool f) (check (lit-var f) vs))]))
  100.  
  101. (define (free-vars-lit f)
  102.   (define (iter f fs)
  103.     (cond [(disj? f) (iter (disj-left f) (iter (disj-rght f) fs))]
  104.           [(conj? f) (iter (conj-left f) (iter (conj-rght f) fs))]
  105.           [(lit? f)  (append (list (lit-var f)) fs)]))
  106.   (remove-duplicates (iter f null)))
  107.  
  108. (define (falsifiable-eval-lit? f)
  109.   (define (helper vs)
  110.     (cond ((null? vs) false)
  111.           ((eval-formula-lit f (car vs)) (helper (cdr vs)))
  112.           (else (car vs))))
  113.   (helper (gen-vals (free-vars-lit f))))
  114.  
  115. (define (nnf? f)
  116.   (cond [(neg? f) (var? (neg-subf f))]
  117.         [(disj? f) (and (nnf? (disj-left f))
  118.                         (nnf? (disj-rght f)))]
  119.         [(conj? f) (and (nnf? (conj-left f))
  120.                         (nnf? (conj-rght f)))]
  121.         [else (var? f)]))
  122.  
  123.  
  124. (define (neg-nnf f)
  125.   (cond [(var? f)  (lit f false)]
  126.         [(neg? f)  (convert-to-nnf (neg-subf f))]
  127.         [(disj? f) (conj (neg-nnf (disj-left f))
  128.                          (neg-nnf (disj-rght f)))]
  129.         [(conj? f) (disj (neg-nnf (conj-left f))
  130.                          (neg-nnf (conj-rght f)))]))
  131.  
  132. (define (convert-to-nnf f)
  133.   (cond [(var? f)  (lit f true)]
  134.         [(neg? f)  (neg-nnf (neg-subf f))]
  135.         [(disj? f) (disj (convert-to-nnf (disj-left f))
  136.                          (convert-to-nnf (disj-rght f)))]
  137.         [(conj? f) (conj (convert-to-nnf (conj-left f))
  138.                          (convert-to-nnf (conj-rght f)))]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement