76 lines
1.3 KiB
Bash
Executable File
76 lines
1.3 KiB
Bash
Executable File
#!/bin/sh
|
|
name=extend-solution.sh
|
|
scriptsdir=`dirname $0`
|
|
colors=$scriptsdir/colors.sh
|
|
if [ -f $colors ]
|
|
then
|
|
. $colors
|
|
else
|
|
BAD=""
|
|
BOLD=""
|
|
NORMAL=""
|
|
fi
|
|
die () {
|
|
echo "${BOLD}$name:${NORMAL} ${BAD}error:${NORMAL} $*" 1>&2
|
|
exit 1
|
|
}
|
|
[ $# -eq 2 ] || \
|
|
die "expected exactly two arguments"
|
|
[ -f $1 ] || \
|
|
die "argument '$1' not a file"
|
|
[ -f $2 ] || \
|
|
die "argument '$2' not a file"
|
|
status="`grep '^s' $1|head -1`"
|
|
case x"$status" in
|
|
x"s SATISFIABLE") ;;
|
|
x"s UNSATISFIABLE") echo "s UNSATISFIABLE"; exit 20;;
|
|
*) die "not valid 's ...' line found in '$1'";;
|
|
esac
|
|
(
|
|
grep '^v' $1;
|
|
awk '{
|
|
printf "c"
|
|
for (i = 1; $i; i++)
|
|
printf " %d", $i
|
|
printf "\nw";
|
|
for (i++; $i; i++)
|
|
printf " %d", $i
|
|
printf "\n"
|
|
}' $2
|
|
) | \
|
|
awk '
|
|
function abs (i) { return i < 0 ? -i : i }
|
|
/^v/{
|
|
for (i = 2; i <= NF; i++) {
|
|
lit = $i;
|
|
idx = abs(lit);
|
|
if (idx) a[idx] = lit;
|
|
}
|
|
}
|
|
/^c/{
|
|
satisfied = 0
|
|
for (i = 2; i <= NF; i++) {
|
|
lit = $i;
|
|
idx = abs(lit);
|
|
tmp = a[idx];
|
|
if (lit < 0) tmp = -tmp;
|
|
if (tmp > 0) satisfied = 1;
|
|
}
|
|
}
|
|
/^w/{
|
|
if (satisfied) next
|
|
for (i = 2; i <= NF; i++) {
|
|
lit = $i;
|
|
idx = abs(lit);
|
|
a[idx] = -a[idx];
|
|
}
|
|
}
|
|
END {
|
|
print "s SATISFIABLE"
|
|
for (i in a)
|
|
print "v", a[i]
|
|
print "v 0"
|
|
}
|
|
'
|
|
exit 10
|