Sindbad~EG File Manager
/* M. Beeson, for MathXpert
9.22.92 original date
1.30.98 last modified
3.4.00 corrected lnleftineq1 and lnleftineq2
3.4.00 corrected logleftineq1 and logleftineq2
*/
#define ALGEBRA_DLL
#include <string.h>
#include "globals.h"
#include "ops.h"
#include "errbuf.h"
#include "prover.h"
/* ____________________________________________________*/
static term ln3(term t)
/* takes the ln, returning u when t has the form e^u */
{ if(ATOMIC(t) || FUNCTOR(t) != '^' || !equals(ARG(0,t),eulere))
return ln1(t);
return ARG(1,t);
}
/* ____________________________________________________*/
static term log3(term t)
/* takes the log, returning u when t has the form 10^u */
{ if(ATOMIC(t) || FUNCTOR(t) != '^' || !equals(ARG(0,t),ten))
return log1(t);
return ARG(1,t);
}
/*______________________________________________________ */
MEXPORT_ALGEBRA int lnineq1(term ineq, term arg, term *next, char *reason)
/* u < v => ln u < ln v, provided u > 0 */
{ unsigned f = FUNCTOR(ineq);
int err;
term u,v;
if(f != '<' && f != '>')
return 1;
u = f == '<' ? ARG(0,ineq) : ARG(1,ineq);
v = f == '<' ? ARG(1,ineq) : ARG(0,ineq);
err = infer(lessthan(zero,u));
if(err)
{ errbuf(0,english(1184));
/* Left side isn't positive */
return 1;
}
*next = f == '<' ? lessthan(ln3(u),ln3(v)) : greaterthan(ln3(v),ln3(u));
strcpy(reason, f == '<' ? english(1623) : english(1653));
/* u<v iff ln u < ln v */
/* u>v iff ln u > ln v */
return 0;
}
/*______________________________________________________ */
MEXPORT_ALGEBRA int lnineq2(term ineq, term arg, term *next, char *reason)
/* u � v => ln u � ln v provided u > 0*/
{ unsigned f = FUNCTOR(ineq);
int err;
term u,v;
if(f != LE && f != GE)
return 1;
u = f == LE ? ARG(0,ineq) : ARG(1,ineq);
v = f == LE ? ARG(1,ineq) : ARG(0,ineq);
err = infer(lessthan(zero,u));
if(err)
{ errbuf(0, english(1184));
/* Left side isn't positive */
return 1;
}
*next = f == LE ? le(ln3(u),ln3(v)) : ge(ln3(v), ln3(u));
strcpy(reason, f == '<' ? english(1625) : english(1626));
/* u�v iff ln u � ln v */
/* u�v iff ln u � ln */
return 0;
}
/*______________________________________________________ */
MEXPORT_ALGEBRA int logineq1(term ineq, term arg, term *next, char *reason)
/* u < v => log u < log v, provided u > 0 */
{ unsigned f = FUNCTOR(ineq);
int err;
term u,v;
if(f != '<' && f != '>')
return 1;
u = f == '<' ? ARG(0,ineq): ARG(1,ineq);
v = f == '<' ? ARG(1,ineq): ARG(0,ineq);
err = infer(lessthan(zero,u));
if(err)
{ errbuf(0, english(1184));
/* Left side isn't positive */
return 1;
}
*next = f == '<' ? lessthan(log3(u),log3(v)): greaterthan(log3(v),log3(u));
strcpy(reason, f == '<' ? english(1624): english(1654));
/* u<v iff log u < log v */
/* u>v iff log u > log v */
return 0;
}
/*______________________________________________________ */
MEXPORT_ALGEBRA int logineq2(term ineq, term arg, term *next, char *reason)
/* u � v => log u � log v provided u > 0*/
{ unsigned f = FUNCTOR(ineq);
int err;
term u,v;
if(f != LE && f != GE)
return 1;
u = f == LE ? ARG(0,ineq): ARG(1,ineq);
v = f == LE ? ARG(1,ineq): ARG(0,ineq);
err = infer(lessthan(zero,u));
if(err)
{ errbuf(0, english(1184));
/* Left side isn't positive */
return 1;
}
*next = f == LE ? le(log3(u),log3(v)): ge(log3(v),log3(u));
strcpy(reason,f == LE ? english(1625): english(1626));
/* u�v iff log u � log v */
/* u�v iff log u � log v */
return 0;
}
/*______________________________________________________ */
MEXPORT_ALGEBRA int expineq1(term ineq, term arg, term *next, char *reason)
/* u < v => a^u < a^v if a > 0, takes arg = a */
{ unsigned short f = FUNCTOR(ineq);
unsigned short g,h;
int err;
term u,v,left,right;
if(f != '<' && f != '>')
return 1;
u = f == '<' ? ARG(0,ineq): ARG(1,ineq);
v = f == '<' ? ARG(1,ineq): ARG(0,ineq);
g = FUNCTOR(u);
h = FUNCTOR(v);
if(FUNCTOR(arg) == ILLEGAL)
{ if(g == LOGB)
arg = ARG(0,u);
else if(h == LOGB)
arg = ARG(0,v);
else if(g == LN || h == LN)
arg = eulere;
else if(g == LOG || h == LOG)
arg = ten;
else
return 1;
}
err = infer(lessthan(zero,u));
if(err)
{ errbuf(0, english(1184));
/* Left side isn't positive */
return 1;
}
if(FUNCTOR(u) == LOGB && equals(ARG(0,u),arg))
left = ARG(1,u);
else
left = make_power(arg,u);
if(FUNCTOR(v) == LOGB && equals(ARG(0,v),arg))
right = ARG(1,v);
else
right = make_power(arg,v);
*next = f == '<' ? lessthan(left,right): greaterthan(right,left);
strcpy(reason, f == '<' ? english(1627): english(1628));
/* u < v iff a^u < a^v */
/* u > v iff a^u > a^v */
return 0;
}
/*______________________________________________________ */
MEXPORT_ALGEBRA int expineq2(term ineq, term arg, term *next, char *reason)
/* u � v => a^u � a^v if a > 0, takes arg in menu mode */
{ unsigned short f = FUNCTOR(ineq);
unsigned short g,h;
int err;
term u,v,left,right;
if(f != LE && f != GE)
return 1;
u = f == LE ? ARG(0,ineq) : ARG(1,ineq);
v = f == LE ? ARG(1,ineq) : ARG(0,ineq);
g = FUNCTOR(u);
h = FUNCTOR(v);
if(FUNCTOR(arg) == ILLEGAL)
{ if(g == LOGB)
arg = ARG(0,u);
else if(h == LOGB)
arg = ARG(0,v);
else if(g == LN || h == LN)
arg = eulere;
else if(g == LOG || h == LOG)
arg = ten;
else
return 1;
}
err = infer(lessthan(zero,u));
if(err)
{ errbuf(0, english(1184));
/* Left side isn't positive */
return 1;
}
if(FUNCTOR(u) == LOGB && equals(arg,ARG(0,u)))
left = ARG(1,u);
else
left = make_power(arg,u);
if(FUNCTOR(v) == LOGB && equals(arg,ARG(0,v)))
right = ARG(1,v);
else
right = make_power(arg,v);
*next = f == LE ? le(left,right): ge(right,left);
strcpy(reason, f == LE ? english(1629): english(1630));
/* u � v iff a^u � a^v */
/* u � v iff a^u � a^v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int lnrightineq1(term t, term arg, term *next, char *reason)
/* u < ln v iff e^u < v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != '<' && f != '>')
return 1;
u = f == '<' ? ARG(0,t) : ARG(1,t);
right = f == '<' ? ARG(1,t) : ARG(0,t);
if(FUNCTOR(right) != LN)
return 1;
v = ARG(0,right);
if(FUNCTOR(u) == LN)
left = ARG(0,u);
else
left = make_power(eulere,u);
*next = f == '<' ? lessthan(left,v) : greaterthan(v,left);
HIGHLIGHT(*next);
strcpy(reason, f == '<' ? english(1631) : english(1635));
/* u < ln v iff e^u < v */
/* ln u > v iff u > e^v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int lnrightineq2(term t, term arg, term *next, char *reason)
/* u � ln v iff e^u � v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != LE && f != GE)
return 1;
u = f == LE ? ARG(0,t) : ARG(1,t);
right = f == LE ? ARG(1,t) : ARG(0,t);
if(FUNCTOR(right) != LN)
return 1;
v = ARG(0,right);
if(FUNCTOR(u) == LN)
left = ARG(0,u);
else
left = make_power(eulere,u);
*next = f == LE ? le(left,v) : ge(v,left);
HIGHLIGHT(*next);
strcpy(reason, f == LE ? english(1633): english(1634));
/* u � ln v iff e^u � v */
/* ln u � v iff u � e^v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int lnleftineq1(term t, term arg, term *next, char *reason)
/* ln u < v iff u < e^v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != '<' && f != '>')
return 1;
v = f == '<' ? ARG(1,t) : ARG(0,t);
left = f == '<' ? ARG(0,t) : ARG(1,t);
if(FUNCTOR(left) != LN)
return 1;
u = ARG(0,left);
if(FUNCTOR(v) == LN)
right = ARG(0,v);
else
right = make_power(eulere,v);
*next = f == '<' ? lessthan(u,right) : greaterthan(right,u);
HIGHLIGHT(*next);
strcpy(reason, f == '<' ? english(1632) : english(1636));
/* ln u < v iff u < e^v */
/* u > ln v iff e^u > v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int lnleftineq2(term t, term arg, term *next, char *reason)
/* ln u � v iff u � e^v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != LE && f != GE)
return 1;
v = f == LE ? ARG(1,t) : ARG(0,t);
left = f == LE ? ARG(0,t) : ARG(1,t);
if(FUNCTOR(left) != LN)
return 1;
u = ARG(0,left);
if(FUNCTOR(v) == LN)
right = ARG(0,v);
else
right = make_power(eulere,v);
*next = f == LE ? le(u,right) : ge(right,u);
HIGHLIGHT(*next);
strcpy(reason, f == LE ? english(1637) : english(1638));
/* ln u � v iff u � e^v */
/* u � ln v iff e^u � v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int logrightineq1(term t, term arg, term *next, char *reason)
/* u < log v iff 10^u < v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != '<' && f != '>')
return 1;
u = f == '<' ? ARG(0,t) : ARG(1,t);
right = f == '<' ? ARG(1,t) : ARG(0,t);
if(FUNCTOR(right) != LOG)
return 1;
v = ARG(0,right);
if(FUNCTOR(u) == LOG)
left = ARG(0,u);
else
left = make_power(ten,u);
*next = f == '<' ? lessthan(left,v) : greaterthan(v,left);
HIGHLIGHT(*next);
strcpy(reason, f == '<' ? english(1639) : english(1640));
/* u < log v iff 10^u < v */
/* log u > v iff u > 10^v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int logleftineq1(term t, term arg, term *next, char *reason)
/* log u < v iff u < 10^v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != '<' && f != '>')
return 1;
v = f == '<' ? ARG(1,t) : ARG(0,t);
left = f == '<' ? ARG(0,t) : ARG(1,t);
if(FUNCTOR(left) != LOG)
return 1;
u = ARG(0,left);
if(FUNCTOR(v) == LOG)
right = ARG(0,v);
else
right = make_power(ten,v);
*next = f == '<' ? lessthan(u,right) : greaterthan(right,u);
HIGHLIGHT(*next);
strcpy(reason, f == '<' ? english(1641) : english(1642));
/* log u < v iff u < 10^v */
/* u > log v iff 10^u > v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int logrightineq2(term t, term arg, term *next, char *reason)
/* u � log v iff 10^u � v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != LE && f != GE)
return 1;
u = f == LE ? ARG(0,t) : ARG(1,t);
right = f == LE ? ARG(1,t) : ARG(0,t);
if(FUNCTOR(right) != LOG)
return 1;
v = ARG(0,right);
if(FUNCTOR(u) == LOG)
left = ARG(0,u);
else
left = make_power(ten,u);
*next = f == LE ? le(left,v) : ge(v,left);
HIGHLIGHT(*next);
strcpy(reason, f == LE ? english(1643): english(1644));
/* u � log v iff 10^u � v */
/* log u � v iff u � 10^v */
return 0;
}
/*_________________________________________________________________*/
MEXPORT_ALGEBRA int logleftineq2(term t, term arg, term *next, char *reason)
/* log u � v iff u � 10^v */
{ unsigned short f = FUNCTOR(t);
term u,v,left,right;
if(f != LE && f != GE)
return 1;
v = f == LE ? ARG(1,t) : ARG(0,t);
left = f == LE ? ARG(0,t) : ARG(1,t);
if(FUNCTOR(left) != LOG)
return 1;
u = ARG(0,left);
if(FUNCTOR(v) == LOG)
right = ARG(0,v);
else
right = make_power(ten,v);
*next = f == LE ? le(u,right) : ge(right,u);
HIGHLIGHT(*next);
strcpy(reason, f == LE ? english(1645) : english(1646));
/* log u � v iff u � 10^v */
/* u � log v iff 10^u � v */
return 0;
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists