Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.81 KB | None | 0 0
  1. #lang racket
  2. (require rackunit)
  3. (require rackunit/text-ui)
  4.  
  5. ;; Autor: Michał Zobniów
  6. ;; Data : 29.03.2019
  7. ;; Filip Sieczkowski pomógł mi ze zrozumieniem treści zadania 2
  8.  
  9. ;; procedury pomocnicze
  10. (define (tagged-tuple? tag len x)
  11. (and (list? x)
  12. (= len (length x))
  13. (eq? tag (car x))))
  14.  
  15. (define (tagged-list? tag x)
  16. (and (pair? x)
  17. (eq? tag (car x))
  18. (list? (cdr x))))
  19.  
  20. ;; reprezentacja formuł w CNFie
  21. ;; zmienne
  22. (define (var? x)
  23. (symbol? x))
  24.  
  25. (define (var x)
  26. x)
  27.  
  28. (define (var-name x)
  29. x)
  30.  
  31. (define (var<? x y)
  32. (symbol<? x y))
  33.  
  34. ;; literały
  35. (define (lit pol var)
  36. (list 'lit pol var))
  37.  
  38. (define (pos x)
  39. (lit true (var x)))
  40.  
  41. (define (neg x)
  42. (lit false (var x)))
  43.  
  44. (define (lit? x)
  45. (and (tagged-tuple? 'lit 3 x)
  46. (boolean? (second x))
  47. (var? (third x))))
  48.  
  49. (define (lit-pol l)
  50. (second l))
  51.  
  52. (define (lit-var l)
  53. (third l))
  54.  
  55. ;; klauzule
  56. (define (clause? c)
  57. (and (tagged-list? 'clause c)
  58. (andmap lit? (cdr c))))
  59.  
  60. (define (clause . lits)
  61. (cons 'clause lits))
  62.  
  63. (define (clause-lits c)
  64. (cdr c))
  65.  
  66. (define (cnf? f)
  67. (and (tagged-list? 'cnf f)
  68. (andmap clause? (cdr f))))
  69.  
  70. (define (cnf . clauses)
  71. (cons 'cnf clauses))
  72.  
  73. (define (cnf-clauses f)
  74. (cdr f))
  75.  
  76. ;; definicja rezolucyjnych drzew wyprowadzenia
  77. (define (axiom? p)
  78. (tagged-tuple? 'axiom 2 p))
  79.  
  80. (define (axiom c)
  81. (list 'axiom c))
  82.  
  83. (define (axiom-clause a)
  84. (second a))
  85.  
  86. (define (res? p)
  87. (tagged-tuple? 'resolve 4 p))
  88.  
  89. (define (res x pf-pos pf-neg)
  90. (list 'resolve x pf-pos pf-neg))
  91.  
  92. (define (res-var p)
  93. (second p))
  94. (define (res-proof-pos p)
  95. (third p))
  96. (define (res-proof-neg p)
  97. (fourth p))
  98.  
  99. (define (proof? p)
  100. (if
  101. (or (and (axiom? p)
  102. (clause? (axiom-clause p)))
  103. (and (res? p)
  104. (var? (res-var p))
  105. (proof? (res-proof-pos p))
  106. (proof? (res-proof-neg p))))
  107. #t
  108. #f))
  109.  
  110. ;;Procedury pomocnicze do szukania klauzuli i literałów;;
  111. (define (find-clause cla prop-cnf)
  112. (if (eq? (cdr prop-cnf) null)
  113. #f
  114. (let ([l (cadr prop-cnf)])
  115. (if (equal? cla l)
  116. #t
  117. (find-clause cla (cdr prop-cnf))))))
  118.  
  119. (define (find-lit lit clause)
  120. (if (eq? (cdr clause) null)
  121. #f
  122. (let ([l (cadr clause)])
  123. (if (equal? lit l)
  124. #t
  125. (find-lit lit (cdr clause))))))
  126.  
  127.  
  128. (define (proof-result pf prop-cnf)
  129. (if (axiom? pf)
  130. (if (null? (clause-lits (axiom-clause pf)))
  131. (axiom-clause pf)
  132. #f)
  133. (cond
  134. ;;Jeżeli prawe i lewe poddrzewo jest axiomem
  135. ((and (axiom? (res-proof-pos pf))
  136. (axiom? (res-proof-neg pf)))
  137.  
  138. (let ([pos (axiom-clause (res-proof-pos pf))]
  139. [neg (axiom-clause (res-proof-neg pf))])
  140. ;;Sprawdzam czy klauzule należą do zbioru klauzli
  141. (if (and (find-clause pos prop-cnf)(find-clause neg prop-cnf))
  142. (let (
  143. [lit-pos (lit #t (res-var pf))]
  144. [lit-neg (lit #f (res-var pf))])
  145. ;;Sprawdzam czy literały należą do klauzuli
  146. (if (and (find-lit lit-pos pos) (find-lit lit-neg neg))
  147. ;;Tworze wynik
  148. (cons 'clause (remove-duplicates (append (filter (λ(x) (not (equal? lit-pos x))) (cdr pos))
  149. (filter (λ(x) (not (equal? lit-neg x))) (cdr neg)))))
  150. #f))
  151. #f))
  152. )
  153.  
  154. ;;Jeżeli lewe poddrzewo jest axiomem, a prawe rezolwenta
  155. ((and (axiom? (res-proof-pos pf))
  156. (res? (res-proof-neg pf)))
  157. ;;res-neg wynik prawego poddrzewa
  158. ;;axiom-neg axiom prawego poddrzewa
  159. (let* ([res-neg (proof-result (res-proof-neg pf) prop-cnf)]
  160. [axiom-neg (axiom res-neg)]
  161. [new-res (res (res-var pf) (res-proof-pos pf) axiom-neg)])
  162. (proof-result new-res (cons 'cnf (cons res-neg (cdr prop-cnf))))))
  163.  
  164. ;;Jeżeli prawe poddrzewo jest axiomem, a lewe rezolwenta
  165. ((and (res? (res-proof-pos pf))
  166. (axiom? (res-proof-neg pf)))
  167. ;;res-pos wynik lewego poddrzewa
  168. ;;axiom-neg axiom lewego poddrzewa
  169. (let* ([res-pos (proof-result (res-proof-pos pf) prop-cnf)]
  170. [axiom-pos (axiom res-pos)]
  171. [new-res (res (res-var pf) axiom-pos (res-proof-neg pf))])
  172. (proof-result new-res (cons 'cnf (cons res-pos (cdr prop-cnf))))))
  173.  
  174. ;;Jeżeli oba drzewa są rezolwentami
  175. ((and (res? (res-proof-pos pf))
  176. (res? (res-proof-neg pf)))
  177. ;;res-pos wynik lewego poddrzewa
  178. ;;axiom-neg axiom lewego poddrzewa
  179. ;;res-neg wynik prawego poddrzewa
  180. ;;axiom-neg axiom prawego poddrzewa
  181. (let* ([res-neg (proof-result (res-proof-neg pf) prop-cnf)]
  182. [res-pos (proof-result (res-proof-pos pf) prop-cnf)]
  183. [axiom-pos (axiom res-pos)]
  184. [axiom-neg (axiom res-neg)]
  185. [new-res (res (res-var pf) axiom-pos axiom-neg)])
  186. (proof-result new-res (cons 'cnf (cons res-neg (cons res-pos (cdr prop-cnf)))))))
  187. )))
  188.  
  189.  
  190. (define (check-proof? pf prop)
  191. (let ((c (proof-result pf prop)))
  192. (and (clause? c)
  193. (null? (clause-lits c)))))
  194.  
  195. ;; XXX: Zestaw testów do zadania pierwszego
  196.  
  197. (define proof-checking-tests
  198. (test-suite "proof-checking-tests"
  199.  
  200. ;;Test z pliku PDF
  201. (test-case "proof-checking-test-1"
  202. (let* ([C1 (clause (lit #t 'p) (lit #t 'q))]
  203. [C2 (clause (lit #f 'p) (lit #t 'q))]
  204. [C3 (clause (lit #f 'q) (lit #t 'r))]
  205. [C4 (clause (lit #f 'q) (lit #f 'r))]
  206. [prop-cnf (cnf C1 C2 C3 C4)]
  207. [A1 (axiom C1)]
  208. [A2 (axiom C2)]
  209. [A3 (axiom C3)]
  210. [A4 (axiom C4)]
  211. [pf (res 'q
  212. (res 'p A1 A2)
  213. (res 'r A3 A4))])
  214. (check-eq? (check-proof? pf prop-cnf) #t)))
  215.  
  216. ;;Test z Whitebooka Zadanie 125
  217. (test-case "proof-checking-test-2"
  218. (let* ([C1 (clause (lit #f 'p)(lit #t 'q))]
  219. [C2 (clause (lit #f 'p)(lit #f 'r)(lit #t 's))]
  220. [C3 (clause (lit #f 'q)(lit #t 'r))]
  221. [C4 (clause (lit #t 'p))]
  222. [C5 (clause (lit #f 's))]
  223. [prop-cnf (cnf C1 C2 C3 C4 C5)]
  224. [A1 (axiom C1)]
  225. [A2 (axiom C2)]
  226. [A3 (axiom C3)]
  227. [A4 (axiom C4)]
  228. [A5 (axiom C5)]
  229. [pf (res 'p
  230. A4
  231. (res 's
  232. (res 'r
  233. (res 'q A1 A3)
  234. A2)
  235. A5))])
  236. (check-eq? (check-proof? pf prop-cnf) #t)))
  237.  
  238. ;;Według (proof?) pojedynczy axiom też jest poprawnym dowodem ale wiemy że zbiór złozony z jednej klauzuli niepustej jest spełnialny
  239. (test-case "proof-checking-test-3"
  240. (let* ([C1 (clause (lit #f 'p)(lit #t 'q))]
  241. [prop-cnf (cnf C1)]
  242. [A1 (axiom C1)]
  243. [pf A1])
  244. (check-eq? (check-proof? pf prop-cnf) #f)))
  245.  
  246. ;;Podobnie jak w test3 tylko że teraz klauzula jest pusta
  247. (test-case "proof-checking-test-4"
  248. (let* ([C1 (clause)]
  249. [prop-cnf (cnf C1)]
  250. [A1 (axiom C1)]
  251. [pf A1])
  252. (check-eq? (check-proof? pf prop-cnf) #t)))))
  253.  
  254.  
  255. ;; testy procedur pomocniczych
  256. (define find-lit-and-find-clause-tests
  257. (test-suite "find-lit-and-find-clause-tests"
  258.  
  259. (test-case "find-clause-test"
  260. (let* ([C1 (clause (lit #t 'p) (lit #t 'q))]
  261. [C2 (clause (lit #f 'p) (lit #t 'q))]
  262. [C3 (clause (lit #f 'q) (lit #t 'r))]
  263. [C4 (clause (lit #f 'q) (lit #f 'r))]
  264. [prop-cnf (cnf C1 C2 C3 C4)])
  265. (check-eq?
  266. (and (eq? (find-clause C1 prop-cnf) #t)
  267. (eq? (find-clause C2 prop-cnf) #t)
  268. (eq? (find-clause C3 prop-cnf) #t)
  269. (eq? (find-clause C4 prop-cnf) #t))
  270. #t)))
  271.  
  272. (test-case "find-lit-test"
  273. (let* ([L1 (lit #t 'p)]
  274. [L2 (lit #t 'q)]
  275. [L3 (lit #t 'z)]
  276. [L4 (lit #t 'r)]
  277. [C1 (clause L1 L2 L3 L4)])
  278. (check-eq?
  279. (and (eq? (find-lit L1 C1) #t)
  280. (eq? (find-lit L2 C1) #t)
  281. (eq? (find-lit L3 C1) #t)
  282. (eq? (find-lit L4 C1) #t))
  283. #t)))))
  284.  
  285. (run-tests find-lit-and-find-clause-tests)
  286. (run-tests proof-checking-tests)
  287.  
  288.  
  289. ;; Wewnętrzna reprezentacja klauzul
  290.  
  291. (define (sorted? ord? xs)
  292. (or (null? xs)
  293. (null? (cdr xs))
  294. (and (ord? (car xs)
  295. (cadr xs))
  296. (sorted? ord? (cdr xs)))))
  297.  
  298. (define (sorted-varlist? xs)
  299. (and (andmap var? xs)
  300. (sorted? var<? xs)))
  301.  
  302. (define (res-clause pos neg pf)
  303. (list 'res-clause pos neg pf))
  304.  
  305. (define (res-clause-pos rc)
  306. (second rc))
  307. (define (res-clause-neg rc)
  308. (third rc))
  309. (define (res-clause-proof rc)
  310. (fourth rc))
  311.  
  312. (define (res-clause? p)
  313. (and (tagged-tuple? 'res-clause 4 p)
  314. (sorted-varlist? (second p))
  315. (sorted-varlist? (third p))
  316. (proof? (fourth p))))
  317.  
  318. ;; implementacja zbiorów / kolejek klauzul do przetworzenia
  319.  
  320. (define clause-set-empty
  321. '(stop () ()))
  322.  
  323. (define (clause-set-add rc rc-set)
  324. (define (eq-cl? sc)
  325. (and (equal? (res-clause-pos rc)
  326. (res-clause-pos sc))
  327. (equal? (res-clause-neg rc)
  328. (res-clause-neg sc))))
  329. (define (add-to-stopped sset)
  330. (let ((procd (cadr sset))
  331. (toproc (caddr sset)))
  332. (cond
  333. [(null? procd) (list 'stop (list rc) '())]
  334. [(or (memf eq-cl? procd)
  335. (memf eq-cl? toproc))
  336. sset]
  337. [else (list 'stop procd (cons rc toproc))])))
  338. (define (add-to-running rset)
  339. (let ((pd (second rset))
  340. (tp (third rset))
  341. (cc (fourth rset))
  342. (rst (fifth rset)))
  343. (if (or (memf eq-cl? pd)
  344. (memf eq-cl? tp)
  345. (eq-cl? cc)
  346. (memf eq-cl? rst))
  347. rset
  348. (list 'run pd tp cc (cons rc rst)))))
  349. (if (eq? 'stop (car rc-set))
  350. (add-to-stopped rc-set)
  351. (add-to-running rc-set)))
  352.  
  353. (define (clause-set-done? rc-set)
  354. (and (eq? 'stop (car rc-set))
  355. (null? (caddr rc-set))))
  356.  
  357. (define (clause-set-next-pair rc-set)
  358. (define (aux rset)
  359. (let* ((pd (second rset))
  360. (tp (third rset))
  361. (nc (car tp))
  362. (rtp (cdr tp))
  363. (cc (fourth rset))
  364. (rst (fifth rset))
  365. (ns (if (null? rtp)
  366. (list 'stop (cons cc (cons nc pd)) rst)
  367. (list 'run (cons nc pd) rtp cc rst))))
  368. (cons cc (cons nc ns))))
  369. (if (eq? 'stop (car rc-set))
  370. (let ((pd (second rc-set))
  371. (tp (third rc-set)))
  372. (aux (list 'run '() pd (car tp) (cdr tp))))
  373. (aux rc-set)))
  374.  
  375. (define (clause-set-done->clause-list rc-set)
  376. (and (clause-set-done? rc-set)
  377. (cadr rc-set)))
  378.  
  379. ;; konwersja z reprezentacji wejściowej na wewnętrzną
  380.  
  381. (define (clause->res-clause cl)
  382. (let ((pos (filter-map (lambda (l) (and (lit-pol l) (lit-var l)))
  383. (clause-lits cl)))
  384. (neg (filter-map (lambda (l) (and (not (lit-pol l)) (lit-var l)))
  385. (clause-lits cl)))
  386. (pf (axiom cl)))
  387. (res-clause (sort pos var<?) (sort neg var<?) pf)))
  388.  
  389. ;; tu zdefiniuj procedury pomocnicze, jeśli potrzebujesz
  390.  
  391. ;;;;; MERGE SORT ;;;;;
  392.  
  393. ;; Mój Merge sort z zadania z List 3 ;;
  394. (define (split xs)
  395. (define (iter acc ys)
  396. (if (<= (length ys) (/ (length xs) 2))
  397. (cons acc (list ys))
  398. (iter (append acc (list (car ys))) (cdr ys))))
  399. (if (< (length xs) 2)
  400. xs
  401. (iter null xs)))
  402.  
  403. (define (merge xs ys)
  404. (define (iter xs ys acc)
  405. (cond [(null? xs) (append acc ys)]
  406. [(null? ys) (append acc xs)]
  407. [(var<? (car xs) (car ys))(iter (cdr xs) ys (append acc (list (car xs))))]
  408. [else (iter xs (cdr ys) (append acc (list (car ys))))]))
  409. (iter xs ys null))
  410.  
  411. (define (merge-sort xs)
  412. (if (< (length xs) 1)
  413. xs
  414. (if (= 1 (length xs))
  415. xs
  416. (let ([ys (split xs)])
  417. (merge (merge-sort (car ys)) (merge-sort (car (cdr ys))))))))
  418. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  419.  
  420. ;;szukam var w liscie varów
  421. (define (find-var var var-list)
  422. (if (null? var-list)
  423. #f
  424. (let ([var-from-var-list (car var-list)])
  425. (if (equal? var var-from-var-list)
  426. var
  427. (find-var var (cdr var-list))))))
  428.  
  429. ;;wybieram var do rezolucji
  430. (define (choose-var pos-vars neg-vars)
  431. (if (null? pos-vars)
  432. #f
  433. (let* ([pos-var (car pos-vars)]
  434. [neg-var (find-var pos-var neg-vars)])
  435. (if (equal? neg-var #f)
  436. (choose-var (cdr pos-vars) neg-vars)
  437. pos-var))))
  438.  
  439. (define (rc-trivial? rc)
  440. (let* ([rc-pos (res-clause-pos rc)]
  441. [rc-neg (res-clause-neg rc)]
  442. [var (choose-var rc-pos rc-neg)])
  443. (if (equal? var #f)
  444. #f
  445. #t)))
  446.  
  447. (define (rc-resolve rc1 rc2)
  448. (let* ([pos-vars-rc1 (res-clause-pos rc1)]
  449. [neg-vars-rc1 (res-clause-neg rc1)]
  450. [pos-vars-rc2 (res-clause-pos rc2)]
  451. [neg-vars-rc2 (res-clause-neg rc2)]
  452. ;;szukam vara dla którego mogę zrobić rezolucje
  453. [res1 (choose-var pos-vars-rc1 neg-vars-rc2)]
  454. [res2 (choose-var pos-vars-rc2 neg-vars-rc1)])
  455. (cond ((not (equal? res1 #f))
  456. ;;rezolucja i budowanie res-clause
  457. (let* ([proof-rc1 (res-clause-proof rc1)]
  458. [proof-rc2 (res-clause-proof rc2)]
  459. [ready-pos-vars-rc1 (filter (λ(x) (not (equal? res1 x))) pos-vars-rc1)]
  460. [ready-neg-vars-rc2 (filter (λ(x) (not (equal? res1 x))) neg-vars-rc2)]
  461. [new-pos-vars (merge-sort (remove-duplicates (append ready-pos-vars-rc1 pos-vars-rc2)))]
  462. [new-neg-vars (merge-sort (remove-duplicates (append neg-vars-rc1 ready-neg-vars-rc2)))]
  463. [new-proof (res res1 proof-rc1 proof-rc2)])
  464. (res-clause new-pos-vars new-neg-vars new-proof)))
  465. ((not (equal? res2 #f))
  466. ;;rezolucja i budowanie res-clause
  467. (let* ([proof-rc1 (res-clause-proof rc1)]
  468. [proof-rc2 (res-clause-proof rc2)]
  469. [ready-neg-vars-rc1 (filter (λ(x) (not (equal? res2 x))) neg-vars-rc1)]
  470. [ready-pos-vars-rc2 (filter (λ(x) (not (equal? res2 x))) pos-vars-rc2)]
  471. [new-pos-vars (merge-sort (remove-duplicates (append ready-pos-vars-rc2 pos-vars-rc1)))]
  472. [new-neg-vars (merge-sort (remove-duplicates (append neg-vars-rc2 ready-neg-vars-rc1)))]
  473. [new-proof (res res2 proof-rc2 proof-rc1)])
  474. (res-clause new-pos-vars new-neg-vars new-proof)))
  475. (else #f))))
  476.  
  477.  
  478. (define (fixed-point op start)
  479. (let ((new (op start)))
  480. (if (eq? new false)
  481. start
  482. (fixed-point op new))))
  483.  
  484. (define (cnf->clause-set f)
  485. (define (aux cl rc-set)
  486. (clause-set-add (clause->res-clause cl) rc-set))
  487. (foldl aux clause-set-empty (cnf-clauses f)))
  488.  
  489. (define (get-empty-proof rc-set)
  490. (define (rc-empty? c)
  491. (and (null? (res-clause-pos c))
  492. (null? (res-clause-neg c))))
  493. (let* ((rcs (clause-set-done->clause-list rc-set))
  494. (empty-or-false (findf rc-empty? rcs)))
  495. (and empty-or-false
  496. (res-clause-proof empty-or-false))))
  497.  
  498. (define (improve rc-set)
  499. (if (clause-set-done? rc-set)
  500. false
  501. (let* ((triple (clause-set-next-pair rc-set))
  502. (c1 (car triple))
  503. (c2 (cadr triple))
  504. (rc-set (cddr triple))
  505. (c-or-f (rc-resolve c1 c2)))
  506. (if (and c-or-f (not (rc-trivial? c-or-f)))
  507. (clause-set-add c-or-f rc-set)
  508. rc-set))))
  509.  
  510. (define (prove cnf-form)
  511. (let* ((clauses (cnf->clause-set cnf-form))
  512. (sat-clauses (fixed-point improve clauses))
  513. (pf-or-false (get-empty-proof sat-clauses)))
  514. (if (eq? pf-or-false false)
  515. 'sat
  516. (list 'unsat pf-or-false))))
  517.  
  518. ;; XXX: Zestaw testów do zadania drugiego
  519.  
  520.  
  521.  
  522. (define prove-tests
  523. (test-suite "prove-tests"
  524. ;;Testuje za pomocą zadania 1
  525.  
  526. ;; Test z pdf z zadania 1
  527. (test-case "prove-test-1"
  528. (let* ([C1 (clause (lit #f 'p) (lit #t 'q))]
  529. [C2 (clause (lit #t 'p) (lit #t 'q))]
  530. [C3 (clause (lit #f 'q) (lit #t 'r))]
  531. [C4 (clause (lit #f 'q) (lit #f 'r))]
  532. [prop-cnf (cnf C1 C2 C3 C4)])
  533. (check-equal? (check-proof? (cadr (prove prop-cnf)) prop-cnf) #t)))
  534.  
  535. ;; Zadanie 125 Whitebook (ma rozwiązanie)
  536. (test-case "prove-test-2"
  537. (let* ([C1 (clause (lit #f 'p)(lit #t 'q))]
  538. [C2 (clause (lit #f 'p)(lit #f 'r)(lit #t 's))]
  539. [C3 (clause (lit #f 'q)(lit #t 'r))]
  540. [C4 (clause (lit #t 'p))]
  541. [C5 (clause (lit #f 's))]
  542. [prop-cnf (cnf C1 C2 C3 C4 C5)])
  543. (check-equal? (check-proof? (cadr (prove prop-cnf)) prop-cnf) #t)))
  544.  
  545. ;; Zadanie 126 Whitebook (ma rozwiązanie)
  546. (test-case "prove-test-3"
  547. (let* ([C1 (clause (lit #t 'p) (lit #t 'r))]
  548. [C2 (clause (lit #f 'r) (lit #f 's))]
  549. [C3 (clause (lit #t 'q) (lit #t 's))]
  550. [C4 (clause (lit #t 'q) (lit #t 'r))]
  551. [C5 (clause (lit #f 'p) (lit #f 'q))]
  552. [C6 (clause (lit #t 's) (lit #t 'p))]
  553. [prop-cnf (cnf C1 C2 C3 C4 C5 C6)])
  554. (check-equal? (check-proof? (cadr (prove prop-cnf)) prop-cnf) #t)))
  555. ;; Przykład który nie ma rozwiązania
  556. (test-case "prove-test-3"
  557. (let* ([C1 (clause (lit #t 'p) (lit #t 'r))]
  558. [prop-cnf (cnf C1)])
  559. (check-equal? (prove prop-cnf) 'sat)))))
  560.  
  561.  
  562. (define rc-trivial?-tests
  563. (test-suite "rc-trivial?-tests"
  564.  
  565. ;;Nietrywialna klauzula
  566. (test-case "prove-test-1"
  567. (let* ([C1 (clause (lit #t 'p) (lit #t 'q))]
  568. [C1-new (clause->res-clause C1)])
  569. (check-equal? (rc-trivial? C1-new) #f)))
  570.  
  571. ;;Trywialna klauzula
  572. (test-case "prove-test-2"
  573. (let* ([C1 (clause (lit #t 'p) (lit #f 'p))]
  574. [C1-new (clause->res-clause C1)])
  575. (check-equal? (rc-trivial? C1-new) #t)))
  576.  
  577. ;;Pusta klauzula
  578. (test-case "prove-test-3"
  579. (let* ([C1 (clause)]
  580. [C1-new (clause->res-clause C1)])
  581. (check-equal? (rc-trivial? C1-new) #f)))))
  582.  
  583. (define rc-resolve-tests
  584. (test-suite "rc-resolve-tests"
  585.  
  586. (test-case "rc-resolve-test-1"
  587. (let* ([C1 (clause (lit #t 'p) (lit #t 'q))]
  588. [C2 (clause (lit #f 'p) (lit #t 'q))]
  589. [C1-new (clause->res-clause C1)]
  590. [C2-new (clause->res-clause C2)])
  591. (check-equal? (res-clause? (rc-resolve C1-new C2-new)) #t)))
  592.  
  593. (test-case "rc-resolve-test-2"
  594. (let* ([C1 (clause (lit #f 'p) (lit #f 'q))]
  595. [C2 (clause (lit #t 's) (lit #t 'p))]
  596. [C1-new (clause->res-clause C1)]
  597. [C2-new (clause->res-clause C2)])
  598. (check-equal? (res-clause? (rc-resolve C1-new C2-new)) #t)))))
  599.  
  600. ;;Testy Procedur Pomocniczych
  601. (define choose-var-and-find-var-tests
  602. (test-suite " choose-var-and-find-var-tests"
  603.  
  604. (test-case "choose-var-test1"
  605. (let* ([pos-vars (list 'p 'r 'q)]
  606. [neg-vars (list 's 'z 'q)])
  607. (check-equal? (choose-var pos-vars neg-vars) 'q)))
  608.  
  609. (test-case "choose-var-test1"
  610. (let* ([pos-vars (list 'p 'r 't)]
  611. [neg-vars (list 's 'z 'q)])
  612. (check-equal? (choose-var pos-vars neg-vars) #f)))
  613.  
  614. (test-case "find-var-test1"
  615. (let* ([var 'q]
  616. [vars (list 's 'z 'q)])
  617. (check-equal? (find-var var vars) 'q)))
  618.  
  619. (test-case "find-var-test1"
  620. (let* ([var 't]
  621. [vars (list 's 'z 'q)])
  622. (check-equal? (find-var var vars) #f)))))
  623.  
  624. (run-tests prove-tests)
  625. (run-tests rc-trivial?-tests)
  626. (run-tests rc-resolve-tests)
  627. (run-tests choose-var-and-find-var-tests)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement