module Data.Answer (
Answer, answer, fromAnswer, true, false, neg, (/\), (\/)
) where
infixr 3 /\
infixr 2 \/
data Answer = Yes | No | Undecided Answer
instance Show Answer
where show a = if fromAnswer a then "true" else "false"
answer :: Bool -> Answer
answer b = Undecided (if b then Yes else No)
fromAnswer :: Answer -> Bool
fromAnswer Yes = True
fromAnswer No = False
fromAnswer (Undecided a) = fromAnswer a
true :: Answer
true = Yes
false :: Answer
false = No
neg :: Answer -> Answer
neg a = Undecided (negative a)
negative :: Answer -> Answer
negative Yes = No
negative No = Yes
negative (Undecided a) = neg a
(/\) :: Answer -> Answer -> Answer
a /\ b = Undecided (conjunction a b)
conjunction :: Answer -> Answer -> Answer
conjunction Yes a = a
conjunction No _ = No
conjunction a Yes = a
conjunction _ No = No
conjunction (Undecided a) (Undecided b) = a /\ b
(\/) :: Answer -> Answer -> Answer
a \/ b = Undecided (disjunction a b)
disjunction :: Answer -> Answer -> Answer
disjunction Yes _ = Yes
disjunction No a = a
disjunction _ Yes = Yes
disjunction a No = a
disjunction (Undecided a) (Undecided b) = a \/ b