RosettaCodeData/Task/Truth-table/EasyLang/truth-table.easy
2026-04-30 12:34:36 -04:00

120 lines
2.3 KiB
Text

global expr$ vars$[] vals[] stack[] .
#
func isop c$ .
return if strpos "&|!^" c$ > 0
.
func$ isvar c$ .
for i = 1 to len vars$[]
if vars$[i] = c$ : return 1
.
return 0
.
func varval c$ .
for i = 1 to len vars$[]
if vars$[i] = c$ : return vals[i]
.
return 0
.
proc push v .
stack[] &= v
.
func pop .
v = stack[$]
len stack[] (len stack[] - 1)
return v
.
func evalexpr .
len stack[] 0
for i = 1 to len expr$
c$ = substr expr$ i 1
if c$ = "T"
push 1
elif c$ = "F"
push 0
elif isvar c$ = 1
push varval c$
elif isop c$ = 1
a = pop
if c$ = "!"
push (1 - a)
elif c$ = "&"
b = pop
push (a * b)
elif c$ = "|"
b = pop
if a = 1 or b = 1 : push 1
if not (a = 1 or b = 1) : push 0
else
# ^
b = pop
push ((a + b) mod 2)
.
else
print "ERROR: syntax"
.
.
if len stack[] <> 1
print "ERROR: stack not single"
return 0
.
return stack[1]
.
proc setvars pos .
if pos > len vars$[]
line$ = ""
for i = 1 to len vars$[]
line$ &= substr "FT" (vals[i] + 1) 1 & " "
.
r = evalexpr
line$ &= substr "FT" (r + 1) 1
print line$
return
.
vals[pos] = 0
setvars pos + 1
vals[pos] = 1
setvars pos + 1
.
print "Enter postfix Boolean expressions."
print "Operators: & | ! ^"
print "Variables: single letters except T/F"
print "Empty line = exit"
repeat
write "\nBoolean expression: "
expr$ = input
until expr$ = ""
h$ = strjoin strtok expr$ " \t" ""
expr$ = ""
for c$ in strchars h$
c = strcode c$
if c >= 97 and c <= 122 : c$ = strchar (c - 32)
expr$ &= c$
.
vars$[] = [ ]
for i = 1 to len expr$
c$ = substr expr$ i 1
if isop c$ = 0
if c$ <> "T" and c$ <> "F" and isvar c$ = 0
vars$[] &= c$
.
.
.
if len vars$[] = 0
print "No variables; quitting."
break 1
.
len vals[] len vars$[]
head$ = ""
for i = 1 to len vars$[] : head$ &= vars$[i] & " "
head$ &= expr$
print ""
print head$
for i = 1 to len head$ : write "="
print ""
setvars 1
.
print ""
#
input_data
A B ^
A B C ^ |