16 | data So : Bool -> Type where
20 | Uninhabited (So False) where
21 | uninhabited Oh
impossible
25 | choose : (b : Bool) -> Either (So b) (So (not b))
26 | choose True = Left Oh
27 | choose False = Right Oh
30 | decSo : (b : Bool) -> Dec (So b)
32 | decSo False = No uninhabited
35 | eqToSo : b = True -> So b
39 | soToEq : So b -> b = True
44 | soToNotSoNot : So b -> Not (So (not b))
45 | soToNotSoNot Oh = uninhabited
49 | soNotToNotSo : So (not b) -> Not (So b)
50 | soNotToNotSo = flip soToNotSoNot
53 | soAnd : {a : Bool} -> So (a && b) -> (So a, So b)
54 | soAnd soab with (choose a)
55 | soAnd {a=True} soab | Left Oh = (Oh, soab)
56 | soAnd {a=True} soab | Right prf = absurd prf
57 | soAnd {a=False} soab | Right prf = absurd soab
60 | andSo : (So a, So b) -> So (a && b)
64 | soOr : {a : Bool} -> So (a || b) -> Either (So a) (So b)
65 | soOr soab with (choose a)
66 | soOr {a=True} _ | Left Oh = Left Oh
67 | soOr {a=False} soab | Right Oh = Right soab
70 | orSo : Either (So a) (So b) -> So (a || b)
72 | orSo (Right Oh) = rewrite orTrueTrue a in