reserve Y for non empty set;
reserve Y for non empty set;

theorem Th12:
  for a,b,c being Function of Y,BOOLEAN holds (a 'imp' b) '&' (b
  'imp' c) = (a 'imp' b) '&' (b 'imp' c) '&' (a 'imp' c)
proof
  let a,b,c be Function of Y,BOOLEAN;
    let x be Element of Y;
A1: ((a 'imp' b) '&' (b 'imp' c) '&' (a 'imp' c)).x =((a 'imp' b) '&' (b
    'imp' c)).x '&' ((a 'imp' c)).x by MARGREL1:def 20
      .=((a 'imp' b).x '&' (b 'imp' c).x) '&' ((a 'imp' c)).x by
MARGREL1:def 20
      .=(('not' a.x 'or' b.x) '&' (b 'imp' c).x) '&' ((a 'imp' c)).x by
BVFUNC_1:def 8
      .=(('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) '&' ((a
    'imp' c)).x by BVFUNC_1:def 8
      .=(('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) '&' ('not' (
    a).x 'or' c.x) by BVFUNC_1:def 8
      .=(('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) '&' 'not' (a
).x 'or' (('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) '&' c.x by
XBOOLEAN:8;
A2: (('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) =((a 'imp' b).
    x '&' ('not' b.x 'or' c.x)) by BVFUNC_1:def 8
      .=(a 'imp' b).x '&' (b 'imp' c).x by BVFUNC_1:def 8
      .=((a 'imp' b) '&' (b 'imp' c)).x by MARGREL1:def 20;
A3: ((a 'imp' b) '&' (b 'imp' c)).x =(a 'imp' b).x '&' (b 'imp' c).x by
MARGREL1:def 20
      .=('not' a.x 'or' b.x) '&' (b 'imp' c).x by BVFUNC_1:def 8
      .=('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x) by BVFUNC_1:def 8
;
    now
      per cases by XBOOLEAN:def 3;
      case
        a.x=TRUE & c.x=TRUE;
        then ((a 'imp' b) '&' (b 'imp' c) '&' (a 'imp' c)).x =(('not' a.x
'or' b.x) '&' ('not' b.x 'or' c.x)) '&' FALSE 'or' (('not' a.x 'or' (b)
        .x) '&' ('not' b.x 'or' c.x)) '&' TRUE by A1
          .=FALSE 'or' (('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x
        )) '&' TRUE
          .=FALSE 'or' (('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x
        ))
          .=((a 'imp' b) '&' (b 'imp' c)).x by A2;
        hence thesis;
      end;
      case
A4:     a.x=TRUE & c.x=FALSE;
        then
A5:     ((a 'imp' b) '&' (b 'imp' c)).x =(FALSE 'or' b.x) '&' ('not' (b
        ).x 'or' FALSE) by A3
          .=(FALSE 'or' b.x) '&' 'not' b.x
          .=b.x '&' 'not' b.x 
          .=FALSE by XBOOLEAN:138;
        ((a 'imp' b) '&' (b 'imp' c) '&' (a 'imp' c)).x =(('not' a.x
'or' b.x) '&' ('not' b.x 'or' c.x)) '&' FALSE 'or' (('not' a.x 'or' (b)
        .x) '&' ('not' b.x 'or' c.x)) '&' FALSE by A1,A4
          .=FALSE;
        hence thesis by A5;
      end;
      case
        a.x=FALSE & c.x=TRUE;
        then ((a 'imp' b) '&' (b 'imp' c) '&' (a 'imp' c)).x =(('not' a.x
'or' b.x) '&' ('not' b.x 'or' c.x)) '&' TRUE 'or' (('not' a.x 'or' b.
        x) '&' ('not' b.x 'or' c.x)) '&' TRUE by A1
          .=((a 'imp' b) '&' (b 'imp' c)).x by A2;
        hence thesis;
      end;
      case
        a.x=FALSE & c.x=FALSE;
        then
        ((a 'imp' b) '&' (b 'imp' c) '&' (a 'imp' c)).x =TRUE '&' (('not'
a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) 'or' FALSE '&' (('not' a.x
        'or' b.x) '&' ('not' b.x 'or' c.x)) by A1
          .=(('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) 'or'
FALSE '&' (('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x))
          .=(('not' a.x 'or' b.x) '&' ('not' b.x 'or' c.x)) 'or'
        FALSE 
          .=((a 'imp' b) '&' (b 'imp' c)).x by A2;
        hence thesis;
      end;
    end;
    hence thesis;
end;
