Sindbad~EG File Manager

Current Path : /usr/home/beeson/Otter-Lambda/yyy/algebra/
Upload File :
Current File : //usr/home/beeson/Otter-Lambda/yyy/algebra/logineq.c

/* 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