Rudy’s OBTF Rudolf Adamkovič

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))))))

© 2025 Rudolf Adamkovič under GNU General Public License (GPL) version 3 or later.
Made with Emacs and secret alien technologies of yesteryear.