/*
 * @(#)$Id: bool_cases,v 1.1.2.2 1999/11/17 09:59:51 rjb Exp $
 *
 * $Log: bool_cases,v $
 * Revision 1.1.2.2  1999/11/17 09:59:51  rjb
 * Bug fix in commented-out code.
 *
 * Revision 1.1.2.1  1999/06/08 14:47:07  rjb
 * Extensions and modifications to support hardware verification.
 *
 */

/* bool_cases is a method for simplifying boolean expressions by
 * case analysis.
 */

method(bool_cases(X),
       H==>G,
       [boolean_type(Bool,True,False),
        member(X:Bool,H),
        freevarinterm(G,X)
       ],
       [replace_all(X,True,G,G1),
        replace_all(X,False,G,G2),
        hfree([Id],H),
        (False = void ->
            (XisTrue = X, XisFalse = (X=>False));
            (XisTrue = (X=True in Bool), XisFalse = (X=False in Bool))),
        write('Boolean cases analysis on '), write(X), nl
       ],
       [[Id:XisTrue|H]==>G1,
        [Id:XisFalse|H]==>G2],
       bool_cases(X)).

method(bool_cases(X),
       H==>X:Bool=>G,
       [boolean_type(Bool,True,False)
       ],
       [replace_all(X,True,G,G1),
        replace_all(X,False,G,G2),
        hfree([Id],H),
        (False = void ->
            (XisTrue = X, XisFalse = (X=>False));
            (XisTrue = (X=True in Bool), XisFalse = (X=False in Bool))),
        write('Boolean cases analysis on '), write(X), nl
       ],
       [[Id:XisTrue|H]==>G1,
        [Id:XisFalse|H]==>G2],
       bool_cases(X)).

/*
% This clause works for all theorems previous to Gordon computer thm.
method(bool_cases(Term),
       H==>G,
       [boolean_type(Bool,True,False),
        matrix(Vars,Matrix,G),          % Type finding
        exp_at(Matrix,Pos,Term),        % Type finding
        append(Vars,H,NewH),            % Type finding
        find_type(NewH,Term,Bool)       % Type finding
       ],
       [replace_all(Term,True,G,G1),
        replace_all(Term,False,G,G2),
        hfree([Id],H),
        (False = void ->
            (TermisTrue = Term, TermisFalse = (Term=>False));
            (TermisTrue = (Term=True in Bool),
             TermisFalse = (Term=False in Bool))),
        write('Boolean cases analysis on '), write(Term), nl
       ],
       [[Id:TermisTrue|H]==>G1,
        [Id:TermisFalse|H]==>G2],
       bool_cases(Term)).
*/

/*
% July 19 1995 Gordon computer
method(bool_cases(Term),
       H==>G,
       [boolean_type(Bool,True,False),
        matrix(Vars,Matrix,G),          % Type finding
        exp_at(Matrix,Pos,Term),        % Type finding
        Term=hd(_),
%        \+ Term=not(_,_),
%        \+ Term=and(_,_),
%        \+ Term=or(_,_),
%        \+ Term=xor(_,_),
        append(Vars,H,NewH),            % Type finding
        find_type(NewH,Term,Bool)       % Type finding
       ],
       [replace_all(Term,True,Matrix,MG1),
        replace_all(Term,False,Matrix,MG2),
        matrix(Vars,MG1,G1),
        matrix(Vars,MG2,G2),
        hfree([Id],H),
        (False = void ->
            (TermisTrue = Term, TermisFalse = (Term=>False));
            (TermisTrue = (Term=True in Bool),
             TermisFalse = (Term=False in Bool))),
        write('Boolean cases analysis on '), write(Term), nl
       ],
       [[Id:TermisTrue|H]==>G1,
        [Id:TermisFalse|H]==>G2],
       bool_cases(Term)).
*/
