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]]
            ]
        ]
    ]
]