1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/*===========================================================================
t <- FMACELLEVAL(F,C,P)
Formula in cell evaluation.
Inputs
F : an FMA formula.
C : an ESPCAD cell.
P : the projection factor set to which C's signiture refers.
Outputs
t : TRUE, FALSE, or UNDET --- the truth value of F in C.
===========================================================================*/
#include "espcad.h"
Word FMACELLEVAL(Word F, Word C, Word P)
{
Word t,L,i,j,k,op,s,S,ip,c,cp,n,t1,A1,A2,U_FLAG;
switch(FIRST(F)) {
case (TRUE) : t = TRUE; break;
case (FALSE): t = FALSE; break;
case (NOTOP):
t = FMACELLEVAL(SECOND(F),C,P);
if (t == TRUE)
t = FALSE;
else if (t == FALSE)
t = TRUE;
break;
case (ANDOP):
U_FLAG = 0;
for(L = RED(F), t = TRUE; t != FALSE && L != NIL; L = RED(L)) {
t = FMACELLEVAL(FIRST(L),C,P);
if (t == UNDET)
U_FLAG = 1; }
if (t == TRUE && U_FLAG)
t = UNDET;
break;
case (OROP):
U_FLAG = 0;
for(L = RED(F), t = FALSE; t != TRUE && L != NIL; L = RED(L)) {
t = FMACELLEVAL(FIRST(L),C,P);
if (t == UNDET)
U_FLAG = 1; }
if (t == FALSE && U_FLAG)
t = UNDET;
break;
case (RIGHTOP):
FIRST3(F,&op,&A1,&A2);
t1 = FMACELLEVAL(A1,C,P);
t = UNDET;
if (t1 == FALSE)
t = TRUE;
else if (t1 == TRUE)
t = FMACELLEVAL(A2,C,P);
else if (FMACELLEVAL(A2,C,P) == TRUE)
t = TRUE;
break;
case (LEFTOP):
FIRST3(F,&op,&A2,&A1);
t1 = FMACELLEVAL(A1,C,P);
t = UNDET;
if (t1 == FALSE)
t = TRUE;
else if (t1 == TRUE)
t = FMACELLEVAL(A2,C,P);
else if (FMACELLEVAL(A2,C,P) == TRUE)
t = TRUE;
break;
case (EQUIOP):
FIRST3(F,&op,&A1,&A2);
t1 = FMACELLEVAL(A1,C,P);
t = UNDET;
if (t1 != UNDET) {
t = FMACELLEVAL(A2,C,P);
if (t != UNDET) { t = (t == t1) ? TRUE : FALSE; } }
break;
default: /* In this case F is an atom. */
FIRST2(FIRST(F),&i,&j);
j = POLINDEX2SIGINDEX(LELTI(P,i),j);
ip = LELTI(LELTI(C,SC_REP),LEVEL) - i;
for(c = C; ip > 0; ip--)
c = LELTI(c,SC_PAR);
if (ip < 0)
t = UNDET;
else {
op = SECOND(F);
if (ISLIST(op)) { /* Involves the extended language. */
FIRST2(op,&op,&k);
cp = LELTI(c,SC_PAR);
n = LELTI(LELTI(cp,SC_RRNV),j);
if (IABSF(k) > n) { /* Not enough roots. */
t = FALSE;
goto Return; }
if (k > 0)
s = LELTI(LELTI(c,SC_EXTS),j) - 2*k;
else
s = LELTI(LELTI(c,SC_EXTS),j) - 2*(n + 1 + k); }
else { /* Does not involve the extended language. */
S = LELTI(c,SC_SIGN);
s = LELTI(S,j); }
switch (op) {
case (LTOP) : t = (s < 0); break;
case (EQOP) : t = (s == 0); break;
case (GTOP) : t = (s > 0); break;
case (GEOP) : t = (s >= 0); break;
case (NEOP) : t = (s != 0); break;
case (LEOP) : t = (s <= 0); break; } }
break;
}
Return:
return t;
}
|