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