File: CHANGEASSUMPTIONSLEVEL.c

package info (click to toggle)
qepcad 1.74%2Bds-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,848 kB
  • sloc: ansic: 27,242; cpp: 2,995; makefile: 1,287; perl: 91
file content (114 lines) | stat: -rw-r--r-- 2,645 bytes parent folder | download | duplicates (2)
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
/*======================================================================
                      Ap <- CHANGEASSUMPTIONSLEVEL(A,r,necflag)

Change assumptions level

Input
  A : the normalized assumptions formula
  r : the target level
  necflag: a BDigit, either 0 or 1
           necflag = 1 means lower level to produce necessary conditions
           necflag = 0 means lower level to produce sufficient conditions
  
Ouput
  Ap : An unnormalized formula of level r.  If necflag = 1, then
       A ==> Ap, if necflag = 0, then Ap => A.
======================================================================*/
#include "qepcad.h"

static Word CHANGEASSUMPTIONSLEVELhelp(Word A, BDigit r, BDigit necflag);

Word CHANGEASSUMPTIONSLEVEL(Word A, BDigit r, BDigit necflag)
{
  Word Ap = CHANGEASSUMPTIONSLEVELhelp(A,r,necflag);
  if (Ap == UNDET && necflag == 1)
    Ap = TRUE;
  else if (Ap == UNDET && necflag == 0)
    Ap = FALSE;
  return Ap;
}

static Word CHANGEASSUMPTIONSLEVELhelp(Word A, BDigit r, BDigit necflag)
{
  Word F, Fp, T, Ap, f;

  if (!ISLIST(A)) { Ap = A; goto Return; }
  F = A;
  T = FIRST(F);
  
Step1: /* NOTOP */
       if (T == NOTOP)
       {
	 Fp = CHANGEASSUMPTIONSLEVEL(SECOND(F),r,(necflag+1)%2);
	 if      (Fp == UNDET) Ap = UNDET;
	 else if (Fp == TRUE)  Ap = FALSE;
	 else if (Fp == FALSE) Ap = TRUE;
	 else Ap = LIST2(NOTOP,Fp);
	 goto Return;
       }
Step2: /* Disjunction. */
       if (T == OROP)
       {
	 Ap = NIL;
	 for(F = RED(F); F != NIL; F = RED(F))
	 {
	   f = CHANGEASSUMPTIONSLEVEL(FIRST(F),r,necflag);
	   if (f == TRUE || (f == UNDET && necflag)) {
	     Ap = f;
	     goto Return; }
	   if (f != UNDET && f != FALSE)
	     Ap = COMP(f,Ap);
	 }
	 if (Ap == NIL)
	   Ap = FALSE;
	 else
	   Ap = COMP(OROP,Ap);
	 goto Return;
       }

Step3: /* Conjunction. */
       if (T == ANDOP)
       {
	 Ap = NIL;
	 for(F = RED(F); F != NIL; F = RED(F))
	 {
	   f = CHANGEASSUMPTIONSLEVEL(FIRST(F),r,necflag);
	   if (f == FALSE || (f == UNDET && !necflag)) {
	     Ap = f;
	     goto Return; }
	   if (f != UNDET && f != TRUE)
	     Ap = COMP(f,Ap);
	 }
	 if (Ap == NIL)
	   Ap = TRUE;
	 else
	   Ap = COMP(ANDOP,Ap);
	 goto Return;
       }

Step4: /* Non-constant normalized atomic formula. */
       if (FIRST(F) == IROOT)
       {
	 if (LELTI(F,5) > r)
	   Ap = UNDET;
	 else
	   Ap = F;
	 goto Return;
       }

       /* Hoon's "true" and "false" - a 0-level formula with polynomial 0. */
       if (THIRD(F) == 0) {
	 Ap = (T == LEOP || T == GEOP || T == EQOP);
	 goto Return;
       }

       if (THIRD(F) > r)
	 Ap = UNDET;
       else
	 Ap = F;
       goto Return;

Return:
       return Ap;
}