home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / rewrite / FuzzyRules.c next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  2.6 KB  |  105 lines

  1. /* $Header: /private/postgres/src/rewrite/RCS/FuzzyRules.c,v 2.3 1992/07/08 20:50:47 joey Exp $ */
  2.  
  3. #ifdef FUZZY
  4. /*
  5.  * DoParallelProofPaths
  6.  *
  7.  * finds all tlist entries with resnames of "u"
  8.  * and combines their values in the way of FRIL
  9.  *
  10.  */
  11.  
  12. List
  13. DoParallelProofPaths ( targetlist )
  14.      List targetlist;
  15. {
  16.     List i = targetlist;
  17.     List upper = NULL;
  18.     List lower = NULL;
  19.     int  dempster_length = 0;
  20.     int  index = 0;
  21.  
  22.     while ( i != LispNil &&
  23.         CAR(i) != LispNil &&
  24.         CAR(CAR(i)) != LispNil &&
  25.         IsA(CAR(CAR(i)),Resdom) &&
  26.         strcmp ( get_resname (CAR(CAR(i))), "l" ))
  27.       i = CDR(i);
  28.  
  29.     /* i should now point to the first "l" node */
  30.  
  31.     dempster_length = length(i);
  32.  
  33.     if ((dempster_length % 2) != 0 ) 
  34.       elog (WARN, "uneven length of support pairs");
  35.     
  36.     dempster_length = dempster_length / 2;
  37.     dempster_length = dempster_length - 1; 
  38.  
  39.     /* if only one, don't need to combine */
  40.     if (dempster_length <= 0 )
  41.       return targetlist;
  42.  
  43.     lispDisplay ( i , 0 );
  44.     printf ("\n%d\n",dempster_length );
  45.  
  46.     for ( index = 0 ; index < dempster_length ; index ++ ) {
  47.     Func udempster     = NULL;
  48.     Func ldempster     = NULL;
  49.     List l1        = CAR(i);
  50.     List u1        = CADR(i);
  51.     List l1_rhs     = CADR(l1);
  52.     List u1_rhs     = CADR(u1);
  53.     List l2_rhs     = CADR(CADR(CDR(i)));
  54.     List u2_rhs     = CADR(CADR(CDR(CDR(i))));
  55.     List l1_resdom     = CAR(l1);
  56.     List u1_resdom     = CAR(u1);
  57.     List u_result     = NULL;
  58.     List l_result     = NULL;
  59.  
  60.     /* remove the second u,l pair from the targetlist 
  61.        since we already have a handle on it, this should be OK */
  62.  
  63.     CDR(CDR(i)) = CDR(CDR(CDR(CDR(i))));
  64.  
  65.     /* XXX - hacks ... should use #defines instead */
  66.  
  67.     udempster = MakeFunc ( F_FUZ_U_DEMPSTER, 701, LispNil, 0, NULL, LispNil, LispNil );
  68.     ldempster = MakeFunc ( F_FUZ_L_DEMPSTER, 701, LispNil, 0, NULL, LispNil, LispNil );
  69.  
  70.     l_result = lispCons ( ldempster,
  71.             lispCons (  l1_rhs, 
  72.              lispCons ( u1_rhs,
  73.               lispCons ( l2_rhs,
  74.                lispCons ( u2_rhs,LispNil )))));
  75.  
  76.     u_result = lispCons ( udempster,
  77.             lispCons (  l1_rhs, 
  78.              lispCons ( u1_rhs,
  79.               lispCons ( l2_rhs,
  80.                lispCons ( u2_rhs,LispNil )))));
  81.     
  82.     CDR(l1) = lispCons(l_result,LispNil);
  83.     CDR(u1) = lispCons(u_result,LispNil);
  84.     }
  85.     
  86.     printf("\n=======> After Dempsterizing, the new targetlist is :\n");
  87.     lispDisplay ( targetlist, 0 );
  88. }
  89. StickOnUpperAndLower ( user, rule )
  90.      List user;
  91.      List rule;
  92. {
  93.     List i = NULL;
  94.  
  95.     foreach ( i , rule ) {
  96.     List entry = CAR(i);
  97.     if ((! strcmp ( get_resname (CAR(entry)), "u") ) ||
  98.         (! strcmp ( get_resname (CAR(entry)), "l") )      )
  99.       CDR(last(user)) = lispCons ( entry, LispNil );
  100.     }
  101.     
  102. }
  103. #endif
  104.  
  105.