Advertisement
drzewo

Untitled

Mar 27th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.51 KB | None | 0 0
  1. #lang racket
  2.  
  3.  
  4. (define (var? t)
  5.   (symbol? t))
  6.  
  7. (define (neg? t)
  8.   (and (list? t)
  9.        (= 2 (length t))
  10.        (eq? 'neg (car t))))
  11.  
  12. (define (conj? t)
  13.   (and (list? t)
  14.         (= 3 (length t))
  15.         (eq? 'conj (car t))))
  16.  
  17. (define (disj? t)
  18.   (and (list? t)
  19.        (= 3 (length t))
  20.        (eq? 'disj (car t))))
  21.  
  22. (define (literal? l)
  23.   (or (var? l)
  24.       (and (neg? l)
  25.            (var? (neg-subf l)))))
  26.  
  27. (define (make-neg t)
  28.   (list 'neg t))
  29.  
  30. (define (neg-subf f)
  31.   (cadr f))
  32.  
  33. (define (make-conj l p)
  34.   (list 'conj l p))
  35.  
  36. (define (make-disj l p)
  37.    (list 'disj l p))
  38.  
  39. (define (disj-left f)
  40.   (second f))
  41.  
  42. (define (disj-rght f)
  43.   (third f))
  44.  
  45. (define (conj-left f)
  46.   (second f))
  47.  
  48. (define (conj-rght f)
  49.   (third f))
  50.  
  51. (define (concat-map f x)
  52.   (apply append (map f x)))
  53.  
  54. (define (make-nnf formula)
  55.   (cond [(var? formula) formula]
  56.         [(conj? formula) (make-conj (make-nnf (conj-left formula)) (make-nnf (conj-rght formula)))]
  57.         [(disj? formula) (make-disj (make-nnf (disj-left formula)) (make-nnf (disj-rght formula)))]
  58.         [(neg? formula) (nnf-help (neg-subf formula))]))
  59.  
  60. (define (nnf-help f)
  61.   (cond [(var? f) (make-neg f)]
  62.         [(neg? f) (make-nnf (neg-subf f))]
  63.         [(conj? f) (make-disj (nnf-help (conj-left f)) (nnf-help (conj-rght f)))]
  64.         [(disj? f) (make-conj (nnf-help (disj-left f)) (nnf-help (disj-rght f)))]))
  65.  
  66.  
  67.  
  68. ;; --------------------ćw 6
  69.  
  70. ;;konsultacja Klaudia Osowska
  71. (define (cnf? f)
  72.   (define (ok? x)
  73.     (and (list? x)
  74.          (= (length x) (length (filter literal? x)))))
  75.   (and (list? f)
  76.        (or (and (= (length f) 1) (ok? (car f)))
  77.            (and (ok? (car f)) (cnf? (cdr f))))))
  78.  
  79.  
  80. ;;implementacja algorytmu udowodnienego na repetytorium
  81. (define (make-cnf formula)
  82.   (cond [(literal? formula) (list (list formula))]
  83.         [(conj? formula) (append (make-cnf (conj-left formula)) (make-cnf (conj-rght formula)))]
  84.         [(disj? formula) (cnf-help (make-cnf (disj-left formula)) (make-cnf (disj-rght formula)))]))
  85.  
  86. (define (cnf-help  f1 f2)
  87.   (concat-map (lambda (x) (map (lambda (y) (append x y)) f2)) f1))
  88.  
  89.  
  90. ;;testy
  91. (define test1 (make-conj (make-conj 'p 'q) (make-disj 't 's)))
  92. (make-cnf (make-nnf test1))
  93.  
  94. (define test2 (make-disj (make-conj 'p 'q) (make-disj 't 's)))
  95. (make-cnf (make-nnf test2))
  96.  
  97. (define test3 (make-conj (make-disj 'p 'q) (make-disj (make-neg 't) 's)))
  98. (make-cnf (make-nnf test3))
  99.  
  100. (define test4 (make-disj (make-conj 'p 'q) (make-conj 't 's)))
  101. (cnf? (make-cnf (make-nnf test4)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement