160 lines
2.8 KiB
Text
160 lines
2.8 KiB
Text
module Ternary_logic {
|
|
class trit {
|
|
private:
|
|
variant val
|
|
function copy() {
|
|
m=this
|
|
m.trit
|
|
=m
|
|
}
|
|
public:
|
|
enum ternary {
|
|
True="True"
|
|
Maybe="Maybe"
|
|
False="False"
|
|
}
|
|
function true() {
|
|
=.copy(.True)
|
|
}
|
|
function maybe() {
|
|
=.copy(.Maybe)
|
|
}
|
|
function false() {
|
|
=.copy(.False)
|
|
}
|
|
operator "==" (k as trit) {
|
|
push .val=k.val
|
|
}
|
|
operator "^^" (k as trit) {
|
|
select enum .val
|
|
case .True
|
|
.val<=k.val
|
|
case .False
|
|
.val<=.False
|
|
case else
|
|
if k.val=.False then .val<=.False else .val<=.Maybe
|
|
end select
|
|
}
|
|
operator "^|" (k as trit) {
|
|
select enum .val
|
|
case .True
|
|
.val<=k.val
|
|
case .False
|
|
.val<=.True
|
|
case else
|
|
if k.val=.True then .val<=.True else .val<=.Maybe
|
|
end select
|
|
}
|
|
operator "||" (k as trit) {
|
|
select enum .val
|
|
case .False
|
|
.val<=k.val
|
|
case .True
|
|
.val<=.True
|
|
case else
|
|
if k.val=.True then .val<=.True else .val<=.Maybe
|
|
end select
|
|
}
|
|
operator "~~" (k as trit) {
|
|
select enum .val
|
|
case .True
|
|
.val<=k.val
|
|
case .False
|
|
if k.val=.True then .val<=.False else.if k.val=.False then .val<=.True else .val<=k.val
|
|
case else
|
|
.val<=.Maybe
|
|
end select
|
|
}
|
|
operator unary {
|
|
select enum .val
|
|
case .True
|
|
.val<=.False
|
|
case .False
|
|
.val<=.True
|
|
end select
|
|
}
|
|
group value {
|
|
value {
|
|
link parent val to val
|
|
=val
|
|
}
|
|
}
|
|
module trit {
|
|
if empty or not isnum then
|
|
read s as .ternary=.Maybe
|
|
.val<=s
|
|
else.if isnum then
|
|
read what
|
|
if what then
|
|
.val<=.True
|
|
else
|
|
.val<=.False
|
|
end if
|
|
end if
|
|
}
|
|
}
|
|
function enum2array(t) {
|
|
m=each(t)
|
|
while m {data eval(m)}
|
|
=array([])
|
|
}
|
|
string out, nl={
|
|
}
|
|
q=trit()
|
|
m=trit()
|
|
k=enum2array(q.ternary)
|
|
out ="not a" + nl
|
|
a=each(k)
|
|
while a
|
|
q=trit(array(a))
|
|
z=-q
|
|
out +=" ternary_not "+(q.value) + " = " + (z.value) + nl
|
|
end while
|
|
out +="a and b" + nl
|
|
a=each(k)
|
|
while a
|
|
b=each(k)
|
|
while b
|
|
q=trit(array(a))
|
|
m=trit(array(b))
|
|
z=q ^^ m
|
|
out += " " + (q.value) + " ternary_and " + (m.value) + " = " + (z.value) + nl
|
|
end while
|
|
end while
|
|
out +="a or b" + nl
|
|
a=each(k)
|
|
while a
|
|
b=each(k)
|
|
while b
|
|
q=trit(array(a))
|
|
m=trit(array(b))
|
|
z=q || m
|
|
out += " " + (q.value) + " ternary_or " + (m.value) + " = " + (z.value) + nl
|
|
end while
|
|
end while
|
|
out +="if a then b" + nl
|
|
a=each(k)
|
|
while a
|
|
b=each(k)
|
|
while b
|
|
q=trit(array(a))
|
|
m=trit(array(b))
|
|
z=q ^| m
|
|
out += " if " + (q.value) + " then " + (m.value) + " = " + (z.value) + nl
|
|
end while
|
|
end while
|
|
out +="a is equivalent to b" + nl
|
|
a=each(k)
|
|
while a
|
|
b=each(k)
|
|
while b
|
|
q=trit(array(a))
|
|
m=trit(array(b))
|
|
z=q ~~ m
|
|
out += " "+(q.value) + " is equivalent to " + (m.value) + " = " + (z.value) + nl
|
|
end while
|
|
end while
|
|
report out
|
|
clipboard out
|
|
}
|
|
Ternary_logic
|