Home / Computer science / SAT solver / Practice implementation: Emacs Lisp
Search: Branching
(defun my-sat-domains-copy (domains &optional branch)
"Return a deep copy of DOMAINS.
DOMAINS is an alist from variable numbers (positive integers) to
domains (lists).
With BRANCH, constrain the first undecided variable to BRANCH."
(let ((copy (copy-tree domains)))
(when branch
(setcdr (rassoc '(0 1) copy)
(list branch)))
copy))
(ert-deftest my-sat-domains-copy/empty ()
(should-not (my-sat-domains-copy '())))
(ert-deftest my-sat-domains-copy/single-member ()
(should (equal (my-sat-domains-copy '((1 . (0 1))))
'((1 . (0 1))))))
(ert-deftest my-sat-domains-copy/single-member/pointer ()
(let ((original '((1 . (0 1)))))
(should-not (eq (my-sat-domains-copy original) original))))
(ert-deftest my-sat-domains-copy/multiple-members ()
(should (equal (my-sat-domains-copy '((1 . (0 1)) (2 . (0))))
'((1 . (0 1)) (2 . (0))))))
(ert-deftest my-sat-domains-copy/branch/first ()
(should (equal (my-sat-domains-copy '((1 . (0 1)) (2 . (0 1))) 1)
'((1 . (1)) (2 . (0 1))))))
(ert-deftest my-sat-domains-copy/branch/second ()
(should (equal (my-sat-domains-copy '((1 . (0)) (2 . (0 1))) 0)
'((1 . (0)) (2 . (0))))))