(* A Quick and Dirty (especially in terms of presentation) Solution to Homework 1 *) (* just wanted to show a non-string solution *) datatype exp = trues | falses | name of int | neg of exp | conj of exp * exp | disj of exp * exp | impl of exp * exp | eq of exp * exp; fun names trues = [] | names falses = [] | names (name i) = [i] | names (neg e) = names e | names (conj(e1,e2)) = (names e1) @ (names e2) | names (disj(e1,e2)) = (names e1) @ (names e2) | names (impl(e1,e2)) = (names e1) @ (names e2) | names (eq(e1,e2)) = (names e1) @ (names e2) ; fun member e [] = false | member e (x::l) = if x=e then true else member e l; fun removedups [] = [] | removedups (x::l) = if (member x l) then (removedups l) else x::(removedups l); fun lookup [] i = (name i) | lookup ((j,v)::l) i = if i=j then v else lookup l i; fun peval trues _ = trues | peval falses _ = falses | peval (name i) s = lookup s i | peval (neg trues) s = falses | peval (neg falses) s = trues | peval (neg e) s = (neg (peval e s)) | peval (conj(falses, _)) s = falses | peval (conj(_ , falses)) s = falses | peval (conj(trues, e)) s = peval e s | peval (conj(e,trues)) s = peval e s | peval (conj(e1,e2)) s = conj((peval e1 s),peval e2 s) | peval (disj(falses,falses)) s = falses | peval (disj(trues,_)) s = trues | peval (disj(_,trues)) s = trues | peval (disj(e1,e2)) s = disj(peval e1 s,peval e2 s) | peval (impl(trues,falses)) s = falses | peval (impl(falses,_)) s = trues | peval (impl(_,trues)) s = trues | peval (impl(e1,e2)) s = impl(peval e1 s,peval e2 s) | peval (eq(falses,falses)) s = trues | peval (eq(trues,trues)) s = trues | peval (eq(trues,falses)) s = falses | peval (eq(falses,trues)) s = falses | peval (eq(e1,e2)) s = eq(peval e1 s,peval e2 s); fun coerce falses = false | coerce trues = true | coerce e = coerce (peval e []); fun runcheck e [] s = coerce (peval e s) | runcheck e (x::l) s = (runcheck (peval e ((x,trues)::s)) l ((x,trues)::s)) andalso (runcheck (peval e ((x,falses)::s)) l ((x,falses)::s)); fun tautp exp = runcheck exp (removedups (names exp)) []; (* some meager test cases *) val yes1 = disj(name 1,(neg (name 1))); val no1 = disj(name 1,name 2); val yes2 = disj(impl(name 1,name 1),conj(name 2,impl(name 2,neg (name 1))));