infixr 3 &&
infixr 2 ||
data Trivalent
= TriFalse
| TriUnknown
| TriTrue
deriving (Show, Eq, Ord)
(&&) :: Trivalent -> Trivalent -> Trivalent
TriFalse && _ = TriFalse
_ && TriFalse = TriFalse
TriTrue && TriTrue = TriTrue
_ && _ = TriUnknown
(||) :: Trivalent -> Trivalent -> Trivalent
TriTrue || _ = TriTrue
_ || TriTrue = TriTrue
TriFalse || TriFalse = TriFalse
_ || _ = TriUnknown
not :: Trivalent
-> Trivalent
not TriUnknown
= TriUnknown
main = do
print $ TriTrue
&& TriFalse
print $ not (TriUnknown
|| TriFalse
&& TriTrue
)
aW1wb3J0IFByZWx1ZGUgaGlkaW5nICgoJiYpLCAofHwpLCBub3QpCgppbmZpeHIgMyAgJiYKaW5maXhyIDIgIHx8CgpkYXRhIFRyaXZhbGVudCA9IFRyaUZhbHNlIHwgVHJpVW5rbm93biB8IFRyaVRydWUgZGVyaXZpbmcgKFNob3csIEVxLCBPcmQpCgooJiYpIDo6IFRyaXZhbGVudCAtPiBUcml2YWxlbnQgLT4gVHJpdmFsZW50ClRyaUZhbHNlICYmIF8gPSBUcmlGYWxzZQpfICYmIFRyaUZhbHNlID0gVHJpRmFsc2UKVHJpVHJ1ZSAmJiBUcmlUcnVlID0gVHJpVHJ1ZQpfICYmIF8gPSBUcmlVbmtub3duCgoofHwpIDo6IFRyaXZhbGVudCAtPiBUcml2YWxlbnQgLT4gVHJpdmFsZW50ClRyaVRydWUgfHwgXyA9IFRyaVRydWUKXyB8fCBUcmlUcnVlID0gVHJpVHJ1ZQpUcmlGYWxzZSB8fCBUcmlGYWxzZSA9IFRyaUZhbHNlCl8gfHwgXyA9IFRyaVVua25vd24KCm5vdCA6OiBUcml2YWxlbnQgLT4gVHJpdmFsZW50Cm5vdCBUcmlUcnVlID0gVHJpRmFsc2UKbm90IFRyaUZhbHNlID0gVHJpVHJ1ZQpub3QgVHJpVW5rbm93biA9IFRyaVVua25vd24KCm1haW4gPSBkbwogICAgcHJpbnQgJCBUcmlUcnVlICYmIFRyaUZhbHNlCiAgICBwcmludCAkIG5vdCAoVHJpRmFsc2UgfHwgVHJpVW5rbm93bikKICAgIHByaW50ICQgbm90IChUcmlVbmtub3duIHx8IFRyaUZhbHNlICYmIFRyaVRydWUp