(* ---------------------------------------------------------------------------- * $Id: MLOGBASE.mi,v 1.3 1994/11/28 21:04:13 dolzmann Exp $ * ---------------------------------------------------------------------------- * Copyright (c) 1993 Universitaet Passau * ---------------------------------------------------------------------------- * This file is part of MAS. * ---------------------------------------------------------------------------- * $Log: MLOGBASE.mi,v $ * Revision 1.3 1994/11/28 21:04:13 dolzmann * New revision of the MASLOG system: New functions and bug fixes of old one. * * Revision 1.2 1993/12/20 19:56:03 dolzmann * Printable names for the operator symbols are changed. * * Revision 1.1 1993/12/17 17:12:13 dolzmann * MASLOG is divided into three parts. (MLOGBASE, MLOGIO, MASLOG) * Additional input procedures are added. * * ---------------------------------------------------------------------------- *) IMPLEMENTATION MODULE MLOGBASE; (* Maslog Base Implementation Module. *) (****************************************************************************** * M L O G B A S E * *-----------------------------------------------------------------------------* * Author: Andreas Dolzmann * * Language: MODULA II (mocka or mtc are possible.) * * System: Program for the computer algebra system MAS by Heinz Kredel. * * Project: MASLOG * Remark: Libraries maskern, maslisp are used. * * Abstract: A package for the MAS computer algebra system by Heinz Kredel. * * This package implements basic routins on formulas of the first * * order predicate calculus. * ******************************************************************************) FROM MASBIOS IMPORT LISTS; FROM MASSTOR IMPORT ADV, COMP, FIRST, LIST, LIST1, LISTVAR, RED, SIL; FROM MASLISPU IMPORT Declare; FROM MASSYM IMPORT ATOM; FROM MASSYM2 IMPORT ASSOC, ASSOCQ, SYMBOL; FROM SACLIST IMPORT ADV2, ADV3, COMP2, LIST2, LIST3, SECOND; CONST rcsidi = "$Id: MLOGBASE.mi,v 1.3 1994/11/28 21:04:13 dolzmann Exp $"; CONST copyrighti = "Copyright (c) 1993 Universitaet Passau"; (****************************************************************************** * G L O B A L V A R I A B L E S * ******************************************************************************) VAR VARTAB: LIST; (* Symbol table for all identifier of variables. *) (****************************************************************************** * B A S I C R O U T I N E S * ******************************************************************************) PROCEDURE FORGOP(phi: LIST): LIST; (* formula get operation. phi is a formula; the operation keyword of the formula phi is returned.*) BEGIN IF phi=SIL THEN RETURN SIL; END; IF SYMBOL(phi) THEN RETURN phi; END; RETURN FIRST(phi); END FORGOP; PROCEDURE FORGARGS(phi: LIST): LIST; (* formula get arguments. phi is a formula; the arguments of the top level operation of the formula phi are returned. You must not apply FORGARGS to formulas without arguments! *) BEGIN RETURN RED(phi); END FORGARGS; PROCEDURE FORGLVAR(lvar: LIST): LIST; (* formula get list of variables. lvar is an object that describes a list of variables; FORGLVAR returns a list of all variables in lvar. *) BEGIN RETURN RED(lvar); END FORGLVAR; PROCEDURE FORPFOR(phi: LIST; VAR op: LIST; VAR args: LIST); (* formula parse formula. phi is a formula; FORPFOR returns in op the top level operation symbol of phi and in args the arguments of the operation op. *) BEGIN IF SYMBOL(phi) THEN op:=phi; args:=SIL; ELSE ADV(phi,op,args); END; END FORPFOR; PROCEDURE FORPARGS(phi: LIST; VAR first, red: LIST); (* formula parse arguments. phi is an object that describes a list of arguments of an operation; FORPARGS returns in first the 1st argument of the list and in red the list of all following arguments. *) BEGIN ADV(phi,first,red); END FORPARGS; PROCEDURE FORPUNOP(phi: LIST; VAR op, arg: LIST); (* formula parse unary operation. phi is a unary operation. The operator symbol op and the argument arg are returned. *) VAR dummy: LIST; BEGIN ADV2(phi,op,arg,dummy); END FORPUNOP; PROCEDURE FORPBINOP(phi: LIST; VAR op, first, second: LIST); (* formula parse binary operation. phi is a binary operation. The operator symbol op and the arguments first and second are returned. *) VAR dummy: LIST; BEGIN ADV3(phi,op,first,second,dummy); END FORPBINOP; PROCEDURE FORPUNOPA(arglist: LIST; VAR arg: LIST); (* formula parse unary operation argument. arglist is a list containing the argument of a unary operator; FORPUNOPA returns in arg the arguments *) VAR dummy: LIST; BEGIN ADV(arglist,arg,dummy); END FORPUNOPA; PROCEDURE FORPBINOPA(red: LIST; VAR first, second: LIST); (* formula parse binary operation argument. red is a list of the arguments of a binary operator; FORPBINOPA returns in first the 1st and in second the 2nd argument. *) VAR dummy: LIST; BEGIN ADV2(red,first,second,dummy); END FORPBINOPA; PROCEDURE FORPQUANT(phi: LIST; VAR quant, vars, formula: LIST); (* formula parse quantifier. phi is a quantified formula; FORPQUANT returns in quant the quantifier of the formula phi, in vars the list of the bound variables (as an lvar object) and in formula the formula phi without quantifier. *) VAR dummy: LIST; BEGIN ADV3(phi,quant,vars,formula,dummy); END FORPQUANT; PROCEDURE FORPQUANTA(red: LIST; VAR lvar, formula: LIST); (* formula parse quantifier arguments. red is the reductum of a quantified formula (e.g returned from FORPFOR); FORPQUANTA returns in lvar a list of all quantified variables as an lvar object and in formula the formula without quantifier. *) VAR dummy: LIST; BEGIN ADV2(red,lvar,formula,dummy); END FORPQUANTA; PROCEDURE FORPLVAR(lvar: LIST; VAR varlist: LIST); (* formula parse list of variables. lvar is an object that describes a list of variables; the list of all variables in lvar is returned in varlist. *) VAR dummy: LIST; BEGIN ADV(lvar,dummy,varlist); END FORPLVAR; PROCEDURE FORPVAR(var: LIST; VAR name, sort: LIST); (* formula parse variable. phi is a variable; FORPVAR returns in name the name and in sort the sort of var. *) VAR dummy1, dummy2: LIST; BEGIN ADV3(var,dummy1,name,sort,dummy2); END FORPVAR; PROCEDURE FORPVARA(red: LIST; VAR name, sort:LIST); (* formula parse variable arguments. red is the reductum of a variable (e.g. returned from FORPFOR); FORPVARA returns in name the name and in sort the sort of the variable. *) VAR dummy: LIST; BEGIN ADV2(red,name,sort,dummy); END FORPVARA; PROCEDURE FORMKFOR(op,args:LIST):LIST; (* formula make formula. op is a operation symbol; args a list of arguments; the formula op(arg1,arg2,...) is returned, if args=(arg1,arg2,...). You can generate constants with this function, too. *) BEGIN IF (op=VERUM) OR (op=FALSUM) THEN RETURN op ELSE RETURN COMP(op,args); END; END FORMKFOR; PROCEDURE FORMKCNST(cnst: LIST):LIST; (* formula make constant, i.e. a function with 0 arguments. cnst is a constant; the formula 'cnst()' is returned *) BEGIN RETURN cnst; END FORMKCNST; PROCEDURE FORMKUNOP(op,arg:LIST):LIST; (* formula make unary operation. op is a operation symbol, arg is a argument; the formula op(arg) is returned. *) BEGIN RETURN LIST2(op,arg); END FORMKUNOP; PROCEDURE FORMKBINOP(op,arg1,arg2:LIST): LIST; (* formula make binary operation. op is the operation symbol, arg1, arg2 are the arguments; the formula op(arg1,arg2) is returned. *) BEGIN RETURN LIST3(op,arg1,arg2); END FORMKBINOP; PROCEDURE FORMKVAR(name,sort:LIST):LIST; (* formula make variable. name is the name, sort the sort of the variable; an object that describes the variable is returned. *) BEGIN RETURN LIST3(TVAR,name,sort); END FORMKVAR; PROCEDURE FORMKLVAR(vars:LIST):LIST; (* formula make list of variables. vars is a list of the form (var1, var2,...); an lvar object that represents the list of variables in vars is returned. *) BEGIN RETURN COMP(LVAR,vars); END FORMKLVAR; PROCEDURE FORMKQUANT(quant,vars,formula:LIST):LIST; (* formula make quantifier. quant is the quantifier symbol, vars is a list of variables, and formula the bound formula; the formula 'quant vars: formula' is returned. *) BEGIN RETURN LIST3(quant,vars,formula); END FORMKQUANT; PROCEDURE FORTST(L: LIST; bbtst:PROCFB1):BOOLEAN; (* formula test. L is a list, bbtst a bb-procedure to test whether a list represents a bb-formula or not; FORTST returns TRUE, if and only if L represents a formula. *) VAR op, red, arg, arg1, arg2, lvar, qform, dummy: LIST; VAR isformula: BOOLEAN; BEGIN IF L = SIL THEN RETURN FALSE; END; IF SYMBOL(L) THEN RETURN (L=VERUM) OR (L=FALSUM) END; IF ATOM(L) THEN RETURN FALSE; END; ADV(L,op,red); IF NOT SYMBOL(op) THEN RETURN FALSE; (* Every correct object starts with a * symbol (keyword). *) END; IF (op=ET) OR (op=VEL) (* All functions with one ore more * arguments. *) THEN IF red = SIL (* No argument? *) THEN RETURN FALSE; END; isformula:=TRUE; WHILE (red <> SIL) AND isformula DO (* All arguments * correct? *) ADV(red,arg,red); isformula:=FORTST(arg,bbtst); END; RETURN isformula; ELSIF op=NON (* All functions with exactly one * argument. *) THEN IF (red=SIL) OR (RED(red)<>SIL) (* number of arguments *) THEN RETURN FALSE; ELSE ADV(red,arg,dummy); RETURN FORTST(arg,bbtst); END; ELSIF (op=EXIST) OR (op=FORALL) (* only quantifiers *) THEN IF (red=SIL) OR (RED(red)=SIL) THEN RETURN FALSE; END; ADV2(red,lvar,qform,dummy); RETURN (dummy=SIL) AND FORISLVAR(lvar) AND FORTST(qform,bbtst); ELSIF (op=IMP) OR (op=REP) OR (op=EQUIV) OR (op=XOR) (* binary * operators *) THEN IF (red=SIL) THEN RETURN FALSE; END; ADV(red,arg1,red); IF red=SIL THEN RETURN FALSE; END; ADV(red,arg2,red); IF (red<>SIL) THEN RETURN FALSE; END; RETURN FORTST(arg1,bbtst) AND FORTST(arg2,bbtst); ELSIF op=TVAR THEN RETURN FORISBOOLVAR(L); ELSE RETURN bbtst(L); END; END FORTST; PROCEDURE FORISVAR(L: LIST):BOOLEAN; (* formula is variable. L is a list; FORISVAR returns TRUE if and only if L represents a variable. (The type of the variable is not checked.) *) VAR key, name, sort, red: LIST; BEGIN IF L = SIL THEN RETURN FALSE; END; IF ATOM(L) OR SYMBOL(L) THEN RETURN FALSE; END; ADV(L,key,red); IF (NOT SYMBOL(key)) OR (key<>TVAR) THEN RETURN FALSE; END; IF red=SIL THEN RETURN FALSE; END; ADV(red,name,red); IF (red=SIL) (* OR NOT SYMBOL(name) *)THEN RETURN FALSE; END; ADV(red,sort,red); IF (red<>SIL) (* OR NOT SYMBOL(sort) *) THEN RETURN FALSE; END; RETURN TRUE; (* No typechecking at moment. *) END FORISVAR; PROCEDURE FORISBOOLVAR(L: LIST):BOOLEAN; (* formula is boolean variable. L is a list; FORISBOOLVAR returns true if and only if L represents a boolean variable *) VAR key, name, sort, red: LIST; BEGIN IF L=SIL THEN RETURN FALSE; END; IF ATOM(L) OR SYMBOL(L) THEN RETURN FALSE; END; ADV(L,key,red); IF (NOT SYMBOL(key)) OR (key<>TVAR) THEN RETURN FALSE; END; IF red=SIL THEN RETURN FALSE; END; ADV(red,name,red); IF (red=SIL) OR NOT SYMBOL(name) THEN RETURN FALSE; END; ADV(red,sort,red); IF (red<>SIL) OR NOT SYMBOL(sort) THEN RETURN FALSE; END; RETURN sort=BOOL END FORISBOOLVAR; PROCEDURE FORISLVAR(L: LIST): BOOLEAN; (* formula is variable list. L is a list; FORISLVAR returns TRUE if and only if L represents an lvar-object. *) VAR elem, key, red: LIST; VAR is: BOOLEAN; BEGIN IF L=SIL THEN RETURN FALSE; END; IF SYMBOL(L) OR ATOM(L) THEN RETURN FALSE; END; ADV(L,key,red); IF (red=SIL) OR (key<>LVAR) THEN RETURN FALSE; END; REPEAT ADV(red,elem,red); is:=FORISVAR(elem); UNTIL (red=SIL) OR (NOT is); RETURN is; END FORISLVAR; (****************************************************************************** * I S A T O M I C F O R M U L A * ******************************************************************************) PROCEDURE FORISATOM(phi: LIST): BOOLEAN; (* formula is atomic formula. phi is a formula, FORISATOM returns true, if and only if phi is an atomic formula. An atomic formula is either VERUM or FALSUM or a bb-formula or a variable of type bool. *) VAR op, res: LIST; BEGIN FORPFOR(phi,op,res); RETURN (op=TVAR) OR (op=VERUM) OR (op=FALSUM) OR ((op<>EXIST) AND (op<>FORALL) AND (op<>VEL) AND (op<>ET) AND (op<>IMP) AND (op<>REP) AND (op<>EQUIV) AND (op<>XOR) AND (op<>NON)) END FORISATOM; PROCEDURE FORISBBFOR(phi: LIST):BOOLEAN; (* formula is black-box formula. phi is a formula. TRUE is returned iff phi is a black-box formula. *) VAR op: LIST; BEGIN op:=FORGOP(phi); RETURN (op<>EXIST) AND (op<>FORALL) AND (op<>VEL) AND (op<>ET) AND (op<>IMP) AND (op<>REP) AND (op<>EQUIV) AND (op<>XOR) AND (op<>NON) AND (op<>TVAR) AND (op<>VERUM) AND (op<>FALSUM); END FORISBBFOR; (****************************************************************************** * V A R T A B * ******************************************************************************) (* In the following section the procedures for handling the VARTAB are implemented. VARTAB is a table of all identifiers which are necessary to identify a variable and its sort unique. The structure of VARTAB is a assoc-list of pairs (name:identifier). Identifiers are beta-integers. This structure of VARTAB is internal. There are external procedures to acess the VARTAB from modules. *) PROCEDURE FORVTSTORE():LIST; (* formula variable table store. The actual VARTAB is returned. *) BEGIN RETURN VARTAB; END FORVTSTORE; PROCEDURE FORVTRESTORE(vt: LIST):LIST; (* formula variable table restore. Vt is a variable table. The actual VARTAB is set to the value of vt. The old value of VARTAB is returned. *) BEGIN VARTAB:=vt; RETURN VARTAB; END FORVTRESTORE; PROCEDURE FORVTENTER(sym: LIST):LIST; (* formula variable table enter. Sym is a CLIST. The symbol with print name sym is entered in the actual variable table, if no symbol with name sym exists. The unique identifier is returned. *) VAR id,lastid: LIST; BEGIN id:=ASSOCQ(sym,VARTAB); IF id=SIL THEN IF VARTAB=SIL THEN lastid:=0; ELSE lastid:=SECOND(VARTAB); END; id:=lastid+1; VARTAB:=COMP2(sym,id,VARTAB); ELSE id:=FIRST(id); END; RETURN id; END FORVTENTER; PROCEDURE FORVTGET(id: LIST): LIST; (* formula variable table get. The clist of the name of the symbol with identifier id is returned. If no symbol with identifier id exists, then SIL is returned. *) VAR l,i,s,name: LIST; BEGIN IF id <= 0 THEN RETURN SIL; END; l:=VARTAB; i:=0; WHILE (l<>SIL) AND (i<>id) DO ADV2(l,s,i,l); END; IF id=i THEN name:=s; ELSE name:=SIL; END; RETURN name; END FORVTGET; (****************************************************************************** * I N I T I A L I Z A T I O N * ******************************************************************************) BEGIN (* OF INITIALIZATION *) LISTVAR(VARTAB); VARTAB:=SIL; BOOL:=FORVTENTER(LISTS("BOOL")); ANY:=FORVTENTER(LISTS("ANY")); Declare(ET, "FORAND"); Declare(VEL, "FOROR"); Declare(NON, "FORNOT"); Declare(VERUM, "TRUE"); Declare(FALSUM,"FALSE"); Declare(FORALL,"FORALL"); Declare(EXIST, "FOREX"); Declare(TVAR, "FORVAR"); Declare(LVAR, "LVAR"); (* Declare(ANY, "ANY"); Declare(BOOL, "BOOL"); *) Declare(REP, "FORREPL"); Declare(IMP, "FORIMPL"); Declare(EQUIV, "FOREQUIV"); Declare(XOR, "FORXOR"); END MLOGBASE. (* -EOF- *)