Ternary logic: Difference between revisions

(Added Forth entry)
Line 4,537:
for a=false and b=false a equivalent b is true
</pre>
 
=={{header|Picat}}==
<lang Picat>main =>
(show_op1('!') ; true),
nl,
foreach(Op in ['/\\','\\/','->','=='])
(show_op2(Op) ; nl,true)
end.
 
ternary(true,'!') = false.
ternary(maybe,'!') = maybe.
ternary(false,'!') = true.
 
ternary(Cond,'!') = Res =>
C1 = cond(Cond == maybe,maybe,cond(Cond,true,false)),
Res = ternary(C1,'!').
 
ternary(true,'/\\',A) = A.
ternary(maybe,'/\\',A) = cond(A==false,false,maybe).
ternary(false,'/\\',_A) = false.
 
ternary(true,'\\/',_A) = true.
ternary(maybe,'\\/',A) = cond(A==true,true, maybe).
ternary(false,'\\/',A) = A.
 
ternary(true,'->',A) = A.
ternary(maybe,'->',A) = cond(A==true,true,maybe).
ternary(false,'->',_) = true.
 
ternary(true,'==',A) = A.
ternary(maybe,'==',_) = maybe.
ternary(false,'==',A) = ternary(A,'!').
 
ternary(Cond1,Op,Cond2) = Res =>
C1 = cond(Cond1 == maybe,maybe,cond(Cond1,true,false)),
C2 = cond(Cond2 == maybe,maybe,cond(Cond2,true,false)),
Res = ternary(C1,Op,C2).
 
show_op1(Op) =>
println(Op),
println(['_' : _ in 1..11]),
foreach(V1 in [true,maybe,false])
V2 = ternary(V1,Op),
printf("%5w %5w \n",V1,V2)
end,
nl.
 
show_op2(Op) =>
Vs = [true,maybe,false],
printf("%2w %5w %5w %5w\n",Op,Vs[1],Vs[2],Vs[3]),
println(['_' : _ in 1..25]),
foreach(V1 in Vs)
printf("%-5w | ", V1),
foreach(V2 in Vs)
C = ternary(V1,Op,V2),
printf("%5w ",C)
end,
nl
end,
nl.</lang>
 
{{out}}
<pre>!
___________
true false
maybe maybe
false true
 
 
/\ true maybe false
_________________________
true | true maybe false
maybe | maybe maybe false
false | false false false
 
\/ true maybe false
_________________________
true | true true true
maybe | true maybe maybe
false | true maybe false
 
-> true maybe false
_________________________
true | true maybe false
maybe | true maybe maybe
false | true true true
 
== true maybe false
_________________________
true | true maybe false
maybe | maybe maybe maybe
false | false maybe true </pre>
 
===Simple examples===
<lang Picat>main =>
println(ternary(10 > 3,'->',maybe).ternary('!')),
println(ternary(4 < 18,'/\\',$not membchk('a',"picat")).ternary('->',maybe).ternary('==',true)).</lang>
 
{{out}}
<pre>maybe
true</pre>
 
=={{header|PicoLisp}}==
495

edits