//------------------------------------------------------------------------------
// Sentential Representation
//------------------------------------------------------------------------------
function symbolp (x)
{return typeof x == 'string'}
function varp (x)
{return typeof x == 'string' && x.length != 0 && x[0] != x[0].toLowerCase()}
function constantp (x)
{return typeof x == 'string' && x.length != 0 && x[0] == x[0].toLowerCase()}
var counter = 0
function newvar ()
{counter++; return 'V' + counter}
function newsym ()
{counter++; return 'c' + counter}
function seq ()
{var exp=new Array(arguments.length);
for (var i=0; i0; i--)
{exp=cons(arguments[i-1],exp)};
return exp}
function len (l)
{var n = 0;
for (var m=l; m!=nil; m = cdr(m)) {n = n+1};
return n}
function memberp (x,l)
{if (nullp(l)) {return false};
if (equalp(car(l),x)) {return true};
if (memberp(x,cdr(l))) {return true};
return false}
function append (l1,l2)
{if (nullp(l1)) {return l2}
else {return cons(car(l1),append(cdr(l1),l2))}}
function nreverse (l)
{if (nullp(l)) {return nil}
else {return nreversexp(l,nil)}}
function nreversexp (l,ptr)
{if (cdr(l) == nil) {l[1] = ptr; return l};
var rev = nreversexp(cdr(l),l);
l[1] = ptr;
return rev}
function acons (x,y,al)
{return cons(cons(x,y),al)}
function assoc (x,al)
{if (nullp(al)) {return false};
if (x == car(car(al))) {return car(al)};
return assoc(x,cdr(al))}
//------------------------------------------------------------------------------
// matcher
//------------------------------------------------------------------------------
function matcher (x,y)
{return match(x,y,nil)}
function match (x,y,bl)
{if (x == y) {return bl};
if (varp(x)) {return matchvar(x,y,bl)};
if (symbolp(x)) {return false};
return matchexp(x,y,bl)}
function matchvar (x,y,bl)
{var dum = assoc(x,bl);
if (dum != false) {return match(cdr(dum),y,bl)};
if (x == matchval(y,bl)) {return bl};
return acons(x,y,bl)}
function matchval (y,bl)
{if (varp(y))
{var dum = assoc(y,bl);
if (dum != false) {return matchval(cdr(dum),bl)};
return y};
return y}
function matchexp(x,y,bl)
{if (symbolp(y)) {return false};
var m = x.length;
var n = y.length;
if (m != n) {return false};
for (var i=0; i 0) {return maatchify(dum[0],dum[1],y,bl,ol)};
if (x == maatchval(y,bl)) {return true};
ol[ol.length] = setbdg(x,al,y,bl);
return true}
function maatchval (y,bl)
{if (varp(y))
{var dum = bl[y];
if (dum != null && dum[1] != nil) {return maatchval(dum[0],dum[1])};
return y};
return y}
function maatchexp(x,al,y,bl,ol)
{if (symbolp(y)) {return false};
var m = x.length;
var n = y.length;
if (m != n) {return false};
for (var i=0; i 0) {return vnify(dum[0],dum[1],y,bl,ol)};
//if (x == vnifyval(y,bl)) {return true};
ol[ol.length] = setbdg(x,al,y,bl);
return true}
function vnifyval (y,bl)
{if (varp(y))
{var dum = bl[y];
if (dum != null && dum[1] != nil) {return vnifyval(dum[0],dum[1])};
return y};
return y}
function vnifyatom (x,al,y,bl,ol)
{if (x == y) {return true};
if (varp(y)) {return vnifyvar(y,bl,x,al,ol)};
return false}
function vnifyexp(x,al,y,bl,ol)
{if (varp(y)) {return vnifyvar(y,bl,x,al,ol)}
if (symbolp(y)) {return false};
if (x.length != y.length) {return false};
for (var i=0; i 0) {return pluug(dum[0],dum[1],bl)};
if (al == bl) {return x};
var rep = newvar();
al[x] = seq(rep,bl);
return rep};
function pluugexp (x,al,bl)
{var exp = new Array(x.length);
for (var i=0; i'; cur++}
else if (charcode == 123) {output[output.length] = '{'; cur++}
else if (charcode == 124) {output[output.length] = '|'; cur++}
else if (charcode == 125) {output[output.length] = '}'; cur++}
else if (charcode == 126) {output[output.length] = '~'; cur++}
else if (idcharp(charcode)) {cur = scansymbol(cur)}
else cur++};
return output}
function scanrulesym (cur)
{if (input.length > cur+1 && input.charCodeAt(cur+1) == 45)
{output[output.length] = ':-'; return cur+2};
if (input.length > cur+1 && input.charCodeAt(cur+1) == 61)
{output[output.length] = ':='; return cur+2}
else {output[output.length] = ':'; return cur+1}}
function scanbacksym (cur)
{if (input.length > cur+1 && input.charCodeAt(cur+1) == 61)
{if (input.length > cur+2 && input.charCodeAt(cur+2) == 62)
{output[output.length] = '<=>'; return cur+3}
else {output[output.length] = '<='; return cur+2}}
else {output[output.length] = '<'; return cur+1}}
function scanthussym (cur)
{if (input.length > cur+1 && input.charCodeAt(cur+1) == 62)
{output[output.length] = '=>'; return cur+2}
else {output[output.length] = '='; return cur+1}}
function scansymbol (cur)
{var n = input.length;
var exp = '';
while (cur < n)
{if (idcharp(input.charCodeAt(cur))) {exp = exp + input.charAt(cur); cur++}
else break};
if (exp != '') {output[output.length] = exp};
return cur}
function scanstring (cur)
{var exp = '"';
cur++;
while (cur < input.length)
{exp = exp + input.charAt(cur);
if (input.charCodeAt(cur) == 34) {cur++; break};
cur++};
output[output.length] = exp;
return cur}
function letterp (charcode)
{return ((charcode >= 65 && charcode <= 90) ||
(charcode >= 97 && charcode <= 122))}
function idcharp (charcode)
{if (charcode == 46) {return true};
if (charcode >= 48 && charcode <= 57) {return true};
if (charcode >= 65 && charcode <= 90) {return true};
if (charcode >= 97 && charcode <= 122) {return true};
if (charcode == 95) {return true};
return false}
//------------------------------------------------------------------------------
function parsedata (str)
{str.push('eof');
input = str;
current = 0;
exp = new Array(0);
while (current < input.length && input[current] != 'eof')
{exp[exp.length] = parsexp('lparen','rparen')};
return exp}
function parseitems (str)
{str.push('eof');
input = str;
current = 0;
exp = seq();
while (current < input.length && input[current] != 'eof')
{if (input[current] == 'comma') {current++};
exp[exp.length] = parsexp('lparen','rparen')};
return exp}
function parse (str)
{str.push('eof');
input = str;
current = 0;
return parsexp('lparen','rparen')}
function parsexp (lop,rop)
{var left = parseprefix(rop);
while (current < input.length)
{if (input[current] == 'eof') {return left}
else if (input[current] == 'lparen') {left = parseatom(left)}
else if (input[current] == '.') {current++; return(left)}
else if (precedencep(lop,input[current])) {return left}
else {left = parseinfix(left,input[current],rop)}};
return left}
function parseprefix (rop)
{var left = input[current];
current++;
if (left == 'lparen') {left = parsexp('lparen','rparen'); current++; return left};
if (left == '~') {return makenegation(parsexp('~',rop))};
if (left == '{') {return parseclause()};
return left}
function parseatom (left)
{var exp = parseparenlist();
exp.unshift(left);
return exp}
function parseparenlist ()
{var exp = new Array(0);
current++;
if (input[current] == 'rparen') {current++; return exp};
while (current < input.length)
{exp.push(parsexp('comma','rparen'));
if (input[current] == 'rparen') {current++; return exp};
if (input[current] == 'comma') {current++} else {return exp}};
return exp}
function parseclause ()
{var exp = seq('clause');
while (current < input.length)
{exp.push(parsexp('comma','rparen'));
if (input[current] == '}') {current++; return exp};
if (input[current] == 'comma') {current++}
else {return exp}};
return exp}
function parseinfix (left,op,rop)
{if (op == ':') {return parsequantifier(left,rop)};
if (op == '&') {return parseand(left,rop)};
if (op == '|') {return parseor(left,rop)};
if (op == '<=>') {return parseequivalence(left,rop)};
if (op == '=>') {return parseimplication(left,rop)};
if (op == '<=') {return parsereduction(left,rop)};
if (op == ':-') {return parserule(left,rop)};
if (op == ':=') {return parsedefinition(left,rop)};
return left}
function parsequantifier (left,rop)
{current++;
if (left[0] == 'A') {return makeuniversal(left.slice(1,left.length),parsexp(':',rop))};
if (left[0] == 'E') {return makeexistential(left.slice(1,left.length),parsexp(':',rop))};
return makeuniversal(left,parsexp(':',rop))}
function parseand (left,rop)
{current++;
return makeconjunction(left,parsexp('&',rop))}
function parseor (left,rop)
{current++;
return makedisjunction(left,parsexp('|',rop))}
function parseequivalence (left,rop)
{current++;
var dum = parsexp('<=>',rop);
return makeequivalence(left,dum)}
function parseimplication (left,rop)
{current++;
var dum = parsexp('=>',rop);
return makeimplication(left,dum)}
function parsereduction (left,rop)
{current++;
var dum = parsexp('<=',rop);
return makereduction(left,dum)}
function parserule (left,rop)
{current++;
var dum = parsexp(':-',rop);
return makerule(left,dum)}
function parsedefinition (left,rop)
{current++;
var dum = parsexp(':=',rop);
return makedefinition(left,dum)}
function precedencep (lop,rop)
{var dum = pp(lop,rop);
//alert(lop + '-' + rop + '-' + dum);
return dum}
function pp (lop,rop)
{if (lop == ':') {return rop != ':'};
if (lop == '~') {return rop != ':'};
if (lop == '&') {return rop != ':' && rop != '~'};
if (lop == '|') {return rop != ':' && rop != '~' && rop != '&'};
if (lop == '=>') {return rop != ':' && rop != '~' && rop != '&' && rop != '|'};
if (lop == '<=') {return rop != ':' && rop != '~' && rop != '&' && rop != '|'};
if (lop == '<=>') {return rop != ':' && rop != '~' && rop != '&' && rop != '|'};
if (lop == ':-') {return rop != ':' && rop != '~' && rop != '&' && rop != '|'};
if (lop == ':=') {return rop != ':' && rop != '~' && rop != '&' && rop != '|'};
return rop != ':' && rop != '~' && rop != '&' && rop != '|'
&& rop != '=>' && rop != '<=' && rop != '<=>'
&& rop != ':-' && rop != ':='}
function parenp (lop,op,rop)
{return precedencep(lop,op) || precedencep(rop,op)}
//------------------------------------------------------------------------------
// readkifdata
// readkif
//------------------------------------------------------------------------------
function readkifdata (str)
{return kifdata(kifscan(str))}
function readkif (str)
{return kif(kifscan(str))}
function kifscan (str)
{input = str;
output = new Array(0);
var cur = 0;
var len = input.length;
while (cur < len)
{var charcode = input.charCodeAt(cur);
if (charcode == 32 || charcode == 13) {cur++}
else if (charcode == 34) {cur = scanstring(cur)}
else if (charcode == 40) {output[output.length] = 'lparen'; cur++}
else if (charcode == 41) {output[output.length] = 'rparen'; cur++}
else if (charcode == 59) {cur = kifscancomment(cur)}
else if (charcode == 63) {cur = kifscanvariable(cur)}
else if (kifidcharp(charcode)) {cur = kifscansymbol(cur)}
else cur++};
return output}
function kifscansymbol (cur)
{var exp = '';
while (cur < input.length)
{if (kifidcharp(input.charCodeAt(cur))) {exp = exp + input[cur]; cur++}
else break};
if (exp != '') {output[output.length] = exp};
return cur}
function kifscanvariable (cur)
{cur++;
var exp = '';
if (letterp(input.charCodeAt(cur)))
{exp=input.slice(cur,cur+1).toUpperCase(); cur++}
else {exp = 'VV'};
while (cur < input.length)
{if (kifidcharp(input.charCodeAt(cur))) {exp = exp + input[cur]; cur++}
else break};
if (exp != '') {output[output.length] = exp};
return cur}
function kifscanstring (cur)
{var exp = '';
cur++
while (cur < input.length && input.charCodeAt(cur) != 34)
{exp = exp + input[cur]; cur++};
cur++;
output[output.length] = exp
return cur}
function kifscancomment (cur)
{while (cur < input.length && input.charCodeAt(cur) != 10 && input.charCodeAt(cur) != 13) {cur++};
return cur}
function kifidcharp (charcode)
{if (charcode == 45) {return true};
if (charcode == 46) {return true};
if (charcode == 60) {return true};
if (charcode == 61) {return true};
if (charcode >= 48 && charcode <= 57) {return true};
if (charcode >= 65 && charcode <= 90) {return true};
if (charcode >= 97 && charcode <= 122) {return true};
if (charcode == 95) {return true};
return false}
function kifdata (str)
{str.push('eof');
input = str;
current = 0;
exp = new Array(0);
while (current < input.length && input[current] != 'eof')
{exp[exp.length] = kifexp()};
return exp}
function kif (str)
{str.push('eof');
input = str;
current = 0;
return kifexp()}
function kifexp ()
{var lexeme = input[current];
if (lexeme == 'eof') {return nil};
if (lexeme == '<=') {current++; return 'rule'};
if (lexeme == 'lparen') {return kifparenlist()};
current++; return lexeme}
function kifparenlist ()
{var exp = new Array(0);
current++;
if (input[current] == 'rparen') {current++; return exp};
while (current < input.length)
{exp.push(kifexp());
if (input[current] == 'rparen') {current++; return exp}};
return exp}
//------------------------------------------------------------------------------
function printseq (p)
{if (typeof p == 'number') {return p};
if (typeof p == 'string') {return '"' + p + '"'};
var n = p.length;
var exp = '(';
if (n>0) {exp += printseq(p[0])};
for (var i=1; i'}
return exp}
function printem (data)
{var exp = '';
var n = data.length;
for (var i=0; i0) {exp += printit(p[0])};
for (var i=1; i\n');
win.document.writeln('<?xml-stylesheet type="text/xsl" href="../stylesheets/proof.xsl"?> \n');
win.document.write(xmlproof());
win.document.close()}
function xmlproof ()
{var exp = '';
exp += '<proof> \n';
for (var i=1; i';
exp += ' <number>' + i + '</number> \n';
exp += ' <sentence>' + grind(proof[i][1]) + '</sentence> \n';
exp += ' <justification>' + prettify(proof[i][2]) + '</justification> \n';
for (var j=3; j\n'};
exp += ' </step> \n'};
exp += '</proof> \n';
return exp}
function xmlify (str)
{str = str.replace('&','&');
str = str.replace('<=>','<=>');
return str}
//------------------------------------------------------------------------------
function smoothdata (data)
{var exp = '';
var n = data.length;
for (var i=0; i'}
return exp}
function smooth (p)
{if (symbolp(p)) {return p};
var exp = p[0] + '(';
if (p.length > 1) {exp += smooth(p[1])};
for (var i=2; i';
exp = exp + '';
exp = exp + '| | '; //exp = exp + ' | ';
exp = exp + 'Step | Proof | Justification | ';
exp = exp + ' ';
for (var i=0; i';
exp = exp + ' | ';
exp = exp + '' + (i/3 + 1) + ' | ';
exp = exp + '' + grind(proof[i+1]) + ' | ';
exp = exp + '' + proof[i+2] + ' | ';
exp = exp + ' |
'};
exp = exp + '