Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.79 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define (neg t)
  4.   (list 'neg t))
  5. (define (neg-subf t)
  6.   (cadr t))
  7.  
  8. (define (conj t f)
  9.   (list 'conj t f))
  10. (define (conj-right t)
  11.   (third t))
  12. (define (conj-left t)
  13.   (second t))
  14. (define (disj t f)
  15.   (list 'disj t f))
  16. (define (disj-left t)
  17.   (second t))
  18. (define (disj-right t)
  19.   (third t))
  20.  
  21. (define (var? t)
  22.   (symbol? t))
  23. (define (neg? t)
  24.   (and (list? t)
  25.        (= 2 (length t))
  26.        (eq? 'neg (car t))))
  27. (define (conj? t)
  28.   (and (list? t)
  29.        (= 3 (length t))
  30.        (eq? 'conj (car t))))
  31. (define (disj? t)
  32.   (and (list? t)
  33.        (= 3 (length t))
  34.        (eq? 'disj (car t))))
  35. (define (prop? f)
  36.   (or (var? f)
  37.       (and (neg? f)
  38.            (prop? (neg-subf f)))
  39.       (and (conj? f)
  40.            (prop? (conj-left f))
  41.            (prop? (conj-right f)))
  42.       (and (disj? f)
  43.            (prop? (disj-left f))
  44.            (prop? (disj-right f)))))
  45.  
  46. ;(define (flatten tree)
  47. ;  (define (dfs t l)
  48.   ;  (cond [(leaf? t) l]
  49.      ;     [else
  50.        ;    (dfs (node-left t) (cons (node-val t) (dfs (node-right t) l)))]))
  51.   ;(dfs tree '()))
  52. (define (free-vars xs)
  53.   (define (notin? var list)
  54.     (cond[(null? list) #t]
  55.          [(eq? var (car list)) #f]
  56.          [else (notin? var (cdr list))]))
  57.   (define (rek xs l)
  58.     (cond [(var? xs) (if (notin? xs l)
  59.                          (cons xs l)
  60.                          l)]
  61.           [(lit? xs) (if (notin? (var xs) l)
  62.                          (cons (var xs) l)
  63.                          l)]
  64.           [(neg? xs) (rek (neg-subf xs) l)]
  65.           [(conj? xs) (rek (conj-left xs) (rek (conj-right xs) l))]
  66.           [(disj? xs) (rek (disj-left xs) (rek (disj-right xs) l))]
  67.           [else (display "error")]))
  68.   (rek xs '()))
  69.  
  70. ( define ( gen-vals xs )
  71. (if ( null? xs )
  72. ( list null )
  73. ( let*
  74. (( vss ( gen-vals ( cdr xs ) ) )
  75. ( x ( car xs ) )
  76. ( vst ( map ( lambda ( vs ) ( cons ( list x true ) vs ) ) vss ) )
  77. ( vsf ( map ( lambda ( vs ) ( cons ( list x false ) vs ) ) vss ) ) )
  78. ( append vst vsf ) ) ) )
  79.  
  80. (define (eval-formula form eval)
  81.   (define (find-val list var)
  82.     (cond[(null? list) (display "error")]
  83.          [(eq? var (caar list)) (cdar list)]
  84.          [else (find-val (cdr list) var)]))
  85.   (define (rek form)
  86.     (cond [(var? form) (find-val eval form)]
  87.           [(lit? form) (xor (negged? form) (find-val eval (var form)))]
  88.           [(neg? form) (not (rek (neg-subf form)))]
  89.           [(conj? form) (and (rek(conj-left form)) (rek(conj-right form)))]
  90.           [(disj? form) (or (rek(disj-left form)) (rek(disj-right form)))]
  91.           [else (display "error")]))
  92.   (rek form))
  93.  
  94. (define (falsifable-eval? form)
  95.   (let([gen (gen-vals (free-vars form))]) ;; gen - wszystkie wartosciowania
  96.     (define (rek gen)
  97.       (cond[(null? gen) #f]
  98.            [(eval-formula form (car gen)) (rek (cdr gen))] ;; jesli formula jest prawda, dajesz nastepne wartosciowanie
  99.            [else (car gen)])) ;; inito
  100.     (rek gen)))
  101. (define (lit? t)
  102.   (and (eq? 'lit (car t))
  103.        (list? t)
  104.        (= 3 (length t))
  105.        (symbol? (third t))))
  106. (define (lit p t)
  107.   (list 'lit p t))
  108. (define (var t)
  109.   (third t))
  110. (define (negged? t)
  111.   (second t))
  112. (define (nnf? form)  
  113.   (cond [(neg? form) (var? (neg-subf form))]
  114.         [(var? form) #t]
  115.         [(lit? form) #t]
  116.         [(conj? form) (and (nnf? (conj-left form)) (nnf? (conj-right form)))]
  117.         [(disj? form) (and (nnf? (disj-left form)) (nnf? (disj-right form)))]))
  118.  
  119. ;(falsifable-eval? (disj 'a (neg (conj 'a 'b))))
  120. (define (convert-to-nnf form)
  121.   (define (neg-this form)
  122.     (cond[(var? form) (lit #t form)]
  123.          [(lit? form) (lit (not (negged? form)) (var form))]
  124.          [(conj? form) (disj (neg-this (conj-left form)) (neg-this (conj-right form)))]
  125.          [(disj? form) (conj (neg-this (disj-left form)) (neg-this (disj-right form)))]
  126.          [(neg? form)  (neg-subf form)]
  127.          [else (display "error")]))
  128.   (define (improve form)
  129.     (cond [(neg? form) (neg-this (neg-subf form))]
  130.           [(var? form) (lit #f form)]
  131.           [(lit? form) form]
  132.           [(conj? form) (conj (improve (conj-left form)) (improve (conj-right form)))]
  133.           [(disj? form) (disj (improve (disj-left form)) (improve (disj-right form)))]
  134.           [else (display "error")]))
  135.   (improve form))
  136.    
  137. ;(convert-to-nnf (neg (conj 'b (conj (lit #t 'v) (disj 'c 'a)))))
  138. ;(falsifable-eval? (disj (list 'lit #t 'a) (conj (neg 'a ) 'b)))
  139.  
  140. (define (cnf? form)
  141.   (define (dnf? form)
  142.     (cond[(null? form) #t]
  143.          [(disj? form) (and (dnf? (disj-left form)) (dnf? (disj-right form)))]
  144.          [(var? form) #t]
  145.          [(lit? form) #t]
  146.          [else #f]))
  147.   (cond[(null? form) #t]
  148.        [(conj? form) (and (cnf? (conj-left form)) (cnf? (conj-right form)))]
  149.        [(not (dnf? form)) #f]
  150.        [else #t]))
  151. (cnf? (conj (conj 'a (disj 'b (conj 'a 'c))) (conj 'a 'v)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement