(defn unapplify [func] (fn [& args] (apply func args))) (def nand (unapplify '{(false false) true (false true) true (true false) true (true true) false}))

Now if a function is finite and we have a complete description of its domain, then we can turn it into a map:

(defn function-to-map [func domain] (zipmap domain (map (partial apply func) domain)))

Now we have the machinery necessary to prove De Morgan's Laws:

(def boolean-pairs '((false false) (false true ) (true false) (true true ))) (= (function-to-map (fn [a b] (not (and a b))) boolean-pairs) (function-to-map (fn [a b] (or (not a) (not b))) boolean-pairs)) (= (function-to-map (fn [a b] (not (or a b))) boolean-pairs) (function-to-map (fn [a b] (and (not a) (not b))) boolean-pairs))

This method works for all finite functions. On the other hand, infinite functions require more sophisticated mathematically machinery.

## No comments:

## Post a Comment