cnf.k
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:3k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * cnf.k  - converting condition to conjunctive normal form
  3.  *
  4.  * This file is a part of GNU SQL Server
  5.  *
  6.  * Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  * Developed at the Institute of System Programming
  8.  * This file is written by Andrew Yahin.
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  * Contacts: gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: cnf.k,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. i4_t assotiative_operation(TXTREF node);
  29. i4_t the_same_code(TXTREF node);
  30. #(Rule "assotiative_to_one"
  31.   (Op:0 "assotiative_operation" { (Op:1) })
  32.   ""
  33.   { 
  34.     (REMOVE (Op:0))
  35.     (Op:1)
  36. } )
  37. #(Rule "nested_assotiative"
  38.   (Op:0 "the_same_code" { 
  39.     (Op:1:exist_op "the_same_code") 
  40.   } )
  41.   ""
  42.   {
  43.     (DELETE (Op:1) (Op:0))    ;; 
  44.     (Op:0 {
  45. (DOWN:list (Op:0))
  46.         (DOWN:list (Op:1))
  47.     } )
  48.     (REMOVE (Op:1))
  49.     (Run "nested_assotiative" (Op:0))
  50.   } 
  51. )
  52. #(Rule "CNF"                           ;; conjunction normal form
  53.  (Or:1 { (And:2:exist_op )})           ;; ...t1 || (a1 && a2 ...) || t2...
  54.   ""                                   ;; op1 -> ...t1 || (a1 && a2...) || t2...
  55.  {                                     ;; op2 -> (a1 && a2...)
  56.    ;; ------------------------------------------------------------------
  57.    (DELETE (Op:2) (Op:1) )             ;; op1 -> ...t1 || t2...
  58.    (COPY:3 (Op:1))                     ;; op3 -> copy of (...t1 || t2...)
  59.    (DOWN:4 (Op:2))                     ;; op4 -> a1 
  60.    (DELETE (Op:4) (Op:2) )             ;; op2 -> (a2 && ...)
  61.    ;; let`s check the case op2 -> (a2) ==> op2 -> a2
  62.    (Run:2 "assotiative_to_one" (Op:2)) ;;
  63.    ;; construction of new tree:
  64.    (Run "nested_assotiative"           ;;
  65.       (And {                           ;;
  66.          (Run "CNF"                    ;; (a2||.t1||t2.)&&(a3||...)&&...
  67.             (Op:1 {                    ;; ( a2 && ...) || ...t1 || t2...  
  68.                (Op:2)                  ;; ( a2 && ...)
  69.                (DOWN:list (Op:1))      ;; (...t1 || t2...)
  70.             } )                        ;;
  71.          )                             ;;
  72.          (Run "CNF"                    ;; (a2||.t1||t2.)&&(a3||...)&&...
  73.             (Run "nested_assotiative"  ;;
  74.                (Op:3 {                 ;; a1 || ...t1 || t2...
  75.                   (Op:4)               ;; a1
  76.                   (DOWN:list (Op:3))   ;; (...t1 || t2...)
  77.                } )                     ;;
  78.             )                          ;;
  79.          )                             ;;
  80.       } )                              ;;
  81.    )                                   ;;
  82.  }                                     ;;
  83. )