46 lines
1.6 KiB
APL
46 lines
1.6 KiB
APL
|
|
truth←{
|
|||
|
|
op←⍉↑'~∧∨≠→('(4 3 2 2 1 0)
|
|||
|
|
order←⍬⍬{
|
|||
|
|
out stk←⍺
|
|||
|
|
0=≢⍵:out,⌽stk
|
|||
|
|
c rst←(⊃⍵) (1↓⍵)
|
|||
|
|
c∊⎕A:((out,c)stk)∇rst
|
|||
|
|
c∊'01':((out,⍎c)stk)∇rst
|
|||
|
|
(c≠'(')∧(≢op)≥n←op[;1]⍳c:rst∇⍨out{
|
|||
|
|
cnd←⌽∧\⌽(⍵≠'(')∧op[op[;1]⍳⍵;2]≥op[n;2]
|
|||
|
|
(⍺,⌽cnd/⍵)(((~cnd)/⍵),c)
|
|||
|
|
}stk
|
|||
|
|
c='(':(out(stk,c))∇rst
|
|||
|
|
c=')':rst∇⍨out{
|
|||
|
|
⍬≡par←⍸'('=⍵:'Missing ('⎕SIGNAL 11
|
|||
|
|
n←⌈/par
|
|||
|
|
(⍺,n↓⍵)((n-1)↑⍵)
|
|||
|
|
}stk
|
|||
|
|
('Invalid character ',c)⎕SIGNAL 11
|
|||
|
|
}1(819⌶)⍵~4↑⎕TC
|
|||
|
|
'('∊order:'Missing )'⎕SIGNAL 11
|
|||
|
|
nvar←≢vars←∪(order∊⎕A)/order
|
|||
|
|
eval←{
|
|||
|
|
⍺←⍬
|
|||
|
|
0=≢⍵:{
|
|||
|
|
1≠≢⍵:'Missing operator'⎕SIGNAL 11 ⋄ ⊃⍵
|
|||
|
|
}⍺
|
|||
|
|
c rst←(⊃⍵) (1↓⍵)
|
|||
|
|
c∊⎕A:(⍺⍺[vars⍳c],⍺)∇rst
|
|||
|
|
c∊0 1:(c,⍺)∇rst
|
|||
|
|
c='~':(⍺≠1 0↑⍨≢⍺)∇rst ⊣ 'Missing operand'⎕SIGNAL(0=≢⍺)/11
|
|||
|
|
c∊op[;1]:({
|
|||
|
|
2>≢⍵:'Missing operand'⎕SIGNAL 11
|
|||
|
|
c='→':(≥/2↑⍵),2↓⍵
|
|||
|
|
((⍎c)/2↑⍵),2↓⍵
|
|||
|
|
}⍺)∇rst
|
|||
|
|
}
|
|||
|
|
_←(nvar/0) eval order
|
|||
|
|
confs←⍉(nvar/2)⊤¯1+⍳2*nvar
|
|||
|
|
tab←'FT│'[1+(confs,2),{⍵ eval order}¨↓confs]
|
|||
|
|
tab←↑,/ ' ',¨tab
|
|||
|
|
hdr←((∊,/(' ',¨vars),' '),[0.5]'─'),⍪'│┼'
|
|||
|
|
hdr←hdr,(' ',⍵,' '),[0.5]'─'
|
|||
|
|
hdr⍪(,∘' '⍣(⊃⊃-/1↓¨⍴¨hdr tab))tab
|
|||
|
|
}
|