# Notice: only work when in PATH, or call using absolute path.
trap
b=$(tput bold)
n=$(tput sgr0)
# Operators
function disj {
[[ $1 == "T" ]] && echo "T" && return
[[ $2 == "T" ]] && echo "T" && return
echo "F" && return
}
function conj {
[[ $1 == "T" && $2 == "T" ]] && echo "T" && return
echo "F" && return
}
function impl {
[[ $1 == "T" && $2 == "F" ]] && echo "F" && return
echo "T" && return
}
function req {
impl $2 $1
}
function eq {
[[ $1 == $2 ]] && echo "T" && return
echo "F" && return
}
function not {
[[ $1 == "T" ]] && echo "F" && return
echo "T" && return
}
[[ $1 == source ]] && return
# Codegen
function mkcode {
tmp="$(mktemp)"
expr_src="$(cat)"
vars="$(_uppercase <<< "$expr_src")"
core_expr="$(sed -e 's/(/$(/g; s/[A-Z]/$&/g;s/^$//; ' <<< "$expr_src")"
{
echo -e '#!/bin/bash\n. '$0' source'
for var in $vars; do echo 'echo -n "'$var'; "'; done;
[[ ! -z $vars ]] && echo 'echo'
for var in $vars; do
echo 'for '$var' in T F; do '
done
for _var in $vars; do
echo 'echo -n "$'$_var'; "'
done
echo 'echo "'$b'=>'$n' '$core_expr';"; '
for var in $vars; do echo 'done; '; done
} > $tmp
bash $tmp
rm $tmp
}
function _uppercase {
tr ' ' '\n' | grep -E '[A-Z]' | sed 's/.*\([A-Z]\).*/\1/' | sort | uniq | tr '\n' ' '
}
function quit {
[[ -e "$tmpd" ]] && rm -r "$tmpd"
exit 0
}
function main {
tmpd="$(mktemp -d)"
cd $tmpd; touch disj conj impl req eq not
echo "nato's logic evaluator (truth table listing) tool, "
echo "version: 0.
echo
echo "commands: "
echo " disj <p> <q>: disjunction of p and q. (or)"
echo " conj <p> <q>: conjunction of p and q. (and)"
echo " impl <p> <q>: p implies q. (condition)"
echo " req <p> <q>: p require q. (n. condition)"
history -s "$expr_"
mkcode <<< "$expr_"
}
quit