DIRECTORY IO USING [STREAM], Rope USING [ROPE]; Boole: CEDAR DEFINITIONS = BEGIN Expression: TYPE = REF; Variable: TYPE = REF; true: READONLY Expression; false: READONLY Expression; Not: PROC [expr: Expression] RETURNS [result: Expression]; And: PROC [expr1, expr2, expr3, expr4, expr5: Expression _ true] RETURNS [result: Expression]; Or: PROC [expr1, expr2, expr3, expr4, expr5: Expression _ false] RETURNS [result: Expression]; Xor: PROC [expr1, expr2, expr3, expr4, expr5: Expression _ false] RETURNS [result: Expression]; Nand: PROC [expr1, expr2, expr3, expr4, expr5: Expression _ true] RETURNS [result: Expression]; Nor: PROC [expr1, expr2, expr3, expr4, expr5: Expression _ false] RETURNS [result: Expression]; AndList: PROC [exprs: LIST OF Expression] RETURNS [result: Expression]; OrList: PROC [exprs: LIST OF Expression] RETURNS [result: Expression]; XorList: PROC [exprs: LIST OF Expression] RETURNS [result: Expression]; NandList: PROC [exprs: LIST OF Expression] RETURNS [result: Expression]; NorList: PROC [exprs: LIST OF Expression] RETURNS [result: Expression]; If: PROC [cond, then, else: Expression] RETURNS [result: Expression]; EqualVar: PROC [var1, var2: Variable] RETURNS [BOOL]; Equal: PROC [expr1, expr2: Expression] RETURNS [BOOL]; Eval: PROC [var: Variable, expr: Expression] RETURNS [whenTrue, whenFalse: Expression]; FullEval: PROC [expr: Expression, evalVar: EvalVar] RETURNS [Expression]; EvalVar: TYPE = PROC [Variable] RETURNS [Expression]; FindVar: PROC [expr: Expression] RETURNS [var: Variable]; EnumerateVars: PROC [expr: Expression, enumVar: EnumVar]; EnumVar: TYPE = PROC [Variable]; HasVar: PROC [expr: Expression, var: Variable] RETURNS [found: BOOL _ FALSE]; PutExpr: PROC [out: IO.STREAM, expr: Expression, deep: INT _ LAST [INT], putRefAny: PROC [IO.STREAM, Variable] _ NIL]; GetExpr: PROC [in: IO.STREAM, getRefAny: PROC [IO.STREAM] RETURNS [Variable] _ NIL] RETURNS [expr: Expression]; ToRope: PROC [expr: Expression, deep: INT _ 5] RETURNS [Rope.ROPE]; FromRope: PROC [rope: Rope.ROPE] RETURNS [Expression]; Case: PRIVATE PROC [whenTrue, whenFalse: Expression] RETURNS [case: ATOM]; END. °Boole.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reversed. Created by Bertrand Serlet July 31, 1985 3:03:17 pm PDT Bertrand Serlet August 19, 1986 6:26:41 pm PDT Barth, August 26, 1986 9:58:59 am PDT Theory This interface defines the basic functions for manipulating Boolean expressions. Expressions may be: constants among {true, false}; variables: any REF. Variables are tested for equality using the REF Equal predicate, apart from ROPEs which compares using Rope.Equal, and REF INT which compares the INTs. expressions created by operators such as Not, And, Or, If, etc ... . Types and Constants Operators returning Expressions Useful operator computing: Or[And[cond, then], And[Not[cond], else]]. Other operations NIL means unknown when returned from FullEval or EvalVar. NIL if no var found or insignificant. Variables which are ROPE or REF INT are handled without calling putRefAny. Variables which are ROPE or REF INT are handled without calling getRefAny Short cut for PutExpr Short cut for GetExpr Private operations that depend on the representation case belongs to {$Case11, $Case00, $Case10, $Case01, $Case1X, $Case0X, $CaseX1, $CaseX0, $CaseXX, $CaseXY} Κκ˜– "Cedar" stylešœ ™ Jšœ Οmœ7™BJ™7J™.Icode™%—J˜šΟk œ˜ Jš žœžœžœžœžœ˜%—J˜JšΟnœžœž œž˜ head™IbodyšœR™Ršœ™IitemšœΟbœ œ™Nš œžœ/žœHžœžœ™¬Nš œ) œ œ œ œ ™D——™Kšœ žœžœ˜Kšœ žœžœ˜K˜Kšœžœ ˜Kšœžœ ˜—šœ™šŸœžœžœ˜:K˜—KšΠbnœžœ8žœ˜^KšŸœžœ9žœ˜^KšŸœžœ9žœ˜_KšŸœžœ8žœ˜_šŸœžœ9žœ˜_K˜—Kš Ÿœžœ žœžœ žœ˜GKš Ÿœžœ žœžœ žœ˜FKš Ÿœžœ žœžœ žœ˜GKš Ÿœžœ žœžœ žœ˜Hš Ÿœžœ žœžœ žœ˜GK˜—šŸœžœ žœ˜EK™E——™šŸœžœžœžœ˜5K˜—šŸœžœžœžœ˜6K˜—šŸœžœ#žœ#˜WK™—šŸœžœ&žœ˜IKšœ žœžœ žœ˜5Kšžœ6™9K˜—šŸœžœžœ˜9K™%K˜—šŸ œžœ&˜9Kšœ žœžœ ˜ K˜—š Ÿœžœ#žœ žœžœ˜MK™—šŸœžœžœžœžœžœžœžœžœžœžœ˜vJšœJ™JJ˜—šŸœžœžœžœ žœžœžœžœžœžœ˜oJšœI™IJ™—š Ÿœžœžœžœžœ˜CJšœ™J˜—šŸœžœ žœžœ˜6Jšœ™——™4š Ÿœžœžœ#žœžœ˜JJšœj™j——J˜Jšžœ˜—…—h