Rebol3 Code Examplex
Ternary logic
Evaluate expressions in three-valued logic.
Rebol [
title: "Rosetta code: Ternary logic"
file: %Ternary_logic.r3
url: https://rosettacode.org/wiki/Ternary_logic
]
maybe: 'maybe ;; third truth value - unknown/undefined
ternary: context [
not: func[a][
either a = maybe [maybe][lib/not a] ;; maybe propagates
]
and: func[a b][
case [
all [a = true b = true ] true ;; both true → true
any [a = false b = false] false ;; either false → false
'else maybe ;; any maybe → maybe
]
]
or: func[a b][
case [
any [a = true b = true ] true ;; either true → true
all [a = false b = false] false ;; both false → false
'else maybe ;; any maybe → maybe
]
]
imp: func[a b][ ;; material implication (a → b)
case [
a = true b ;; true → b = b
a = false true ;; false → b = true
b = true true ;; a → true = true
'else maybe ;; uncertain antecedent/consequent
]
]
eq: func[a b][
case [
a = b true
any [a = maybe b = maybe] maybe ;; unknown if either is maybe
'else false
]
]
]
¬: :ternary/not
∧: make op! :ternary/and
∨: make op! :ternary/or
⊃: make op! :ternary/imp
≡: make op! :ternary/eq
values: reduce [true false maybe]
foreach [name op] [NOT ¬ AND ∧ OR ∨ IMP ⊃ EQ ≡] [
print ["^/=== TERNARY" name "==="]
foreach a values [
either name = 'NOT [
printf ["¬ " 6 "= "] [a ¬ a]
][
foreach b values [
printf [6 2 6 "= "][a op b try reduce [a op b]]
]
]
]
]Output:
=== TERNARY NOT ===
¬ true = false
¬ false = true
¬ maybe = maybe
=== TERNARY AND ===
true ∧ true = true
true ∧ false = false
true ∧ maybe = maybe
false ∧ true = false
false ∧ false = false
false ∧ maybe = false
maybe ∧ true = maybe
maybe ∧ false = false
maybe ∧ maybe = maybe
=== TERNARY OR ===
true ∨ true = true
true ∨ false = true
true ∨ maybe = true
false ∨ true = true
false ∨ false = false
false ∨ maybe = maybe
maybe ∨ true = true
maybe ∨ false = maybe
maybe ∨ maybe = maybe
=== TERNARY IMP ===
true ⊃ true = true
true ⊃ false = false
true ⊃ maybe = maybe
false ⊃ true = true
false ⊃ false = true
false ⊃ maybe = true
maybe ⊃ true = true
maybe ⊃ false = maybe
maybe ⊃ maybe = maybe
=== TERNARY EQ ===
true ≡ true = true
true ≡ false = false
true ≡ maybe = maybe
false ≡ true = false
false ≡ false = true
false ≡ maybe = maybe
maybe ≡ true = maybe
maybe ≡ false = maybe
maybe ≡ maybe = true