"{begin Assume that we need to check the equvalence of the Boolean functions defined as follows. ops f g : Bool Bool Bool Bool Bool Bool Bool Bool Bool Bool -> Bool . vars X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 : Bool . eq f(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) = (X0 or (X9 implies (X6 or (not X2 and X4)))) implies (not X5 or (X8 iff (X7 iff (X1 or X3)))) . eq g(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) = not(not(X7 iff (X8 iff (X1 or X3))) and X0) or not(X5 or (X6 or (not X9 or (X4 and not X2)))) . By making use of GENcases, we can check whether these two Boolean functions f and g are equal, and if not, show all argument lists of true and false (e.g. a list like (false,true,true,false,true,false,false,true,true,true)) that makes the two functions have different values. end}" -- a solution mod! BOOLfun {pr(BOOL) ops f g : Bool Bool Bool Bool Bool Bool Bool Bool Bool Bool -> Bool . vars X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 : Bool . eq f(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) = (X0 or (X9 implies (X6 or (not X2 and X4)))) implies (not X5 or (X8 iff (X7 iff (X1 or X3)))) . eq g(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) = not(not(X7 iff (X8 iff (X1 or X3))) and X0) or not(X5 or (X6 or (not X9 or (X4 and not X2)))) . } in genCases.cafe -- predicate to be checked mod! BOOLfunPtbc { pr(BOOLfun) -- val and ValSeq [Bool < Val < ValSq] op _,_ : ValSq ValSq -> ValSq {assoc} . -- predicate to be checked op v_ : ValSq -> Bool . vars X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 : Bool . eq v(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) = f(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) iff g(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) . -- indicator information [IndInfo] op ii_ : ValSq -> IndInfo . } open GENcases(BOOLfunPtbc) . -- (1) checking only the equvalence ops X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 : -> Bool . red f(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) iff g(X0,X1,X2,X3,X4,X5,X6,X7,X8,X9) . -- (2) with the instances that make the differences op gen&ck : -> IndTr . eq gen&ck = ($ | mmi[(true;false),(true;false),(true;false),(true;false), (true;false),(true;false),(true;false),(true;false), (true;false),(true;false)]) . red gen&ck . close