TPTP Problem File: COM222_1.p

View Solutions - Solve Problem

%------------------------------------------------------------------------------
% File     : COM222_1 : TPTP v9.3.1. Released v9.3.0.
% Domain   : Computing Theory
% Problem  : AE-Preservation-Plus-isNV-False-isSomeTerm-False
% Version  : Especial.
% English  :

% Refs     : [GE+15] Grewe et al. (2015), Type Systems for the Masses: Deri
%          : [GE+18] Grewe et al. (2018), System Description: An Infrastruc
%          : [GE+18] Grewe et al. (2018), Exploration of Language Specifica
%          : [Gre19] Grewe (2019), Automating Type Soundness Proofs for Dom
%          : [Gre24] Grewe (2015), Email to Geoff Sutcliffe
% Source   : [Gre24]
% Names    : AE-Preservation-Plus-isNV-False-isSomeTerm-False [Gre24]

% Status   : Theorem
% Rating   : 0.17 v9.3.0
% Syntax   : Number of formulae    :  132 (  45 unt;  24 typ;   0 def)
%            Number of atoms       :  379 ( 252 equ)
%            Maximal formula atoms :  125 (   3 avg)
%            Number of connectives :  418 ( 147   ~;  54   |; 158   &)
%                                         (   2 <=>;  57  =>;   0  <=;   0 <~>)
%            Maximal formula depth :   40 (   5 avg)
%            Maximal term depth    :    6 (   1 avg)
%            Number of types       :    4 (   3 usr)
%            Number of type conns  :   18 (  13   >;   5   *;   0   +;   0  <<)
%            Number of predicates  :    5 (   4 usr;   0 prp; 1-2 aty)
%            Number of functors    :   17 (  17 usr;   8 con; 0-3 aty)
%            Number of variables   :  300 ( 231   !;  69   ?; 300   :)
% SPC      : TF0_THM_EQU_NAR_NDT

% Comments :
%------------------------------------------------------------------------------
tff('Term_type',type,
    vTerm: $tType ).

tff('OptTerm_type',type,
    vOptTerm: $tType ).

tff('Ty_type',type,
    vTy: $tType ).

tff('Nat_type',type,
    vNat: vTy ).

tff('Succ_type',type,
    vSucc: vTerm > vTerm ).

tff('Pred_type',type,
    vPred: vTerm > vTerm ).

tff(someTerm_type,type,
    vsomeTerm: vTerm > vOptTerm ).

tff('Zero_type',type,
    vZero: vTerm ).

tff('Iszero_type',type,
    vIszero: vTerm > vTerm ).

tff('True_type',type,
    vTrue: vTerm ).

tff('False_type',type,
    vFalse: vTerm ).

tff(noTerm_type,type,
    vnoTerm: vOptTerm ).

tff('Plus_type',type,
    vPlus: ( vTerm * vTerm ) > vTerm ).

tff(t2_type,type,
    vt2: vTerm ).

tff('B_type',type,
    vB: vTy ).

tff('Ifelse_type',type,
    vIfelse: ( vTerm * vTerm * vTerm ) > vTerm ).

tff(t1_type,type,
    vt1: vTerm ).

tff(isValue_type,type,
    visValue: vTerm > $o ).

tff(isNV_type,type,
    visNV: vTerm > $o ).

tff(reduce_type,type,
    vreduce: vTerm > vOptTerm ).

tff(plusop_type,type,
    vplusop: ( vTerm * vTerm ) > vTerm ).

tff(isSomeTerm_type,type,
    visSomeTerm: vOptTerm > $o ).

tff(ptchecksimple_type,type,
    vptchecksimple: ( vTerm * vTy ) > $o ).

tff(getTerm_type,type,
    vgetTerm: vOptTerm > vTerm ).

tff('dom-Term',axiom,
    ! [VX: vTerm] :
      ( ( VX = vTrue )
      | ( VX = vFalse )
      | ? [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( VX = vIfelse(VTerm0,VTerm1,VTerm2) )
      | ( VX = vZero )
      | ? [VTerm0: vTerm] : ( VX = vSucc(VTerm0) )
      | ? [VTerm0: vTerm] : ( VX = vPred(VTerm0) )
      | ? [VTerm0: vTerm] : ( VX = vIszero(VTerm0) )
      | ? [VTerm0: vTerm,VTerm1: vTerm] : ( VX = vPlus(VTerm0,VTerm1) ) ) ).

tff('EQ-Ifelse',axiom,
    ! [VTerm3: vTerm,VTerm2: vTerm,VTerm1: vTerm,VTerm4: vTerm,VTerm0: vTerm,VTerm5: vTerm] :
      ( ( vIfelse(VTerm0,VTerm1,VTerm2) = vIfelse(VTerm3,VTerm4,VTerm5) )
     => ( ( VTerm0 = VTerm3 )
        & ( VTerm1 = VTerm4 )
        & ( VTerm2 = VTerm5 ) ) ) ).

tff('EQ-Succ',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] :
      ( ( vSucc(VTerm0) = vSucc(VTerm1) )
     => ( VTerm0 = VTerm1 ) ) ).

tff('EQ-Pred',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] :
      ( ( vPred(VTerm0) = vPred(VTerm1) )
     => ( VTerm0 = VTerm1 ) ) ).

tff('EQ-Iszero',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] :
      ( ( vIszero(VTerm0) = vIszero(VTerm1) )
     => ( VTerm0 = VTerm1 ) ) ).

tff('EQ-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm,VTerm3: vTerm] :
      ( ( vPlus(VTerm0,VTerm1) = vPlus(VTerm2,VTerm3) )
     => ( ( VTerm0 = VTerm2 )
        & ( VTerm1 = VTerm3 ) ) ) ).

tff('DIFF-True-False',axiom,
    vTrue != vFalse ).

tff('DIFF-True-Ifelse',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( vTrue != vIfelse(VTerm0,VTerm1,VTerm2) ) ).

tff('DIFF-True-Zero',axiom,
    vTrue != vZero ).

tff('DIFF-True-Succ',axiom,
    ! [VTerm0: vTerm] : ( vTrue != vSucc(VTerm0) ) ).

tff('DIFF-True-Pred',axiom,
    ! [VTerm0: vTerm] : ( vTrue != vPred(VTerm0) ) ).

tff('DIFF-True-Iszero',axiom,
    ! [VTerm0: vTerm] : ( vTrue != vIszero(VTerm0) ) ).

tff('DIFF-True-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] : ( vTrue != vPlus(VTerm0,VTerm1) ) ).

tff('DIFF-False-Ifelse',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( vFalse != vIfelse(VTerm0,VTerm1,VTerm2) ) ).

tff('DIFF-False-Zero',axiom,
    vFalse != vZero ).

tff('DIFF-False-Succ',axiom,
    ! [VTerm0: vTerm] : ( vFalse != vSucc(VTerm0) ) ).

tff('DIFF-False-Pred',axiom,
    ! [VTerm0: vTerm] : ( vFalse != vPred(VTerm0) ) ).

tff('DIFF-False-Iszero',axiom,
    ! [VTerm0: vTerm] : ( vFalse != vIszero(VTerm0) ) ).

tff('DIFF-False-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] : ( vFalse != vPlus(VTerm0,VTerm1) ) ).

tff('DIFF-Ifelse-Zero',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( vIfelse(VTerm0,VTerm1,VTerm2) != vZero ) ).

tff('DIFF-Ifelse-Succ',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm,VTerm3: vTerm] : ( vIfelse(VTerm0,VTerm1,VTerm2) != vSucc(VTerm3) ) ).

tff('DIFF-Ifelse-Pred',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm,VTerm3: vTerm] : ( vIfelse(VTerm0,VTerm1,VTerm2) != vPred(VTerm3) ) ).

tff('DIFF-Ifelse-Iszero',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm,VTerm3: vTerm] : ( vIfelse(VTerm0,VTerm1,VTerm2) != vIszero(VTerm3) ) ).

tff('DIFF-Ifelse-Plus',axiom,
    ! [VTerm3: vTerm,VTerm2: vTerm,VTerm1: vTerm,VTerm4: vTerm,VTerm0: vTerm] : ( vIfelse(VTerm0,VTerm1,VTerm2) != vPlus(VTerm3,VTerm4) ) ).

tff('DIFF-Zero-Succ',axiom,
    ! [VTerm0: vTerm] : ( vZero != vSucc(VTerm0) ) ).

tff('DIFF-Zero-Pred',axiom,
    ! [VTerm0: vTerm] : ( vZero != vPred(VTerm0) ) ).

tff('DIFF-Zero-Iszero',axiom,
    ! [VTerm0: vTerm] : ( vZero != vIszero(VTerm0) ) ).

tff('DIFF-Zero-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] : ( vZero != vPlus(VTerm0,VTerm1) ) ).

tff('DIFF-Succ-Pred',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] : ( vSucc(VTerm0) != vPred(VTerm1) ) ).

tff('DIFF-Succ-Iszero',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] : ( vSucc(VTerm0) != vIszero(VTerm1) ) ).

tff('DIFF-Succ-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( vSucc(VTerm0) != vPlus(VTerm1,VTerm2) ) ).

tff('DIFF-Pred-Iszero',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] : ( vPred(VTerm0) != vIszero(VTerm1) ) ).

tff('DIFF-Pred-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( vPred(VTerm0) != vPlus(VTerm1,VTerm2) ) ).

tff('DIFF-Iszero-Plus',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm,VTerm2: vTerm] : ( vIszero(VTerm0) != vPlus(VTerm1,VTerm2) ) ).

tff('dom-OptTerm',axiom,
    ! [VX: vOptTerm] :
      ( ( VX = vnoTerm )
      | ? [VTerm0: vTerm] : ( VX = vsomeTerm(VTerm0) ) ) ).

tff('EQ-someTerm',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] :
      ( ( vsomeTerm(VTerm0) = vsomeTerm(VTerm1) )
     => ( VTerm0 = VTerm1 ) ) ).

tff('DIFF-noTerm-someTerm',axiom,
    ! [VTerm0: vTerm] : ( vnoTerm != vsomeTerm(VTerm0) ) ).

tff('dom-Ty',axiom,
    ! [VX: vTy] :
      ( ( VX = vB )
      | ( VX = vNat ) ) ).

tff('DIFF-B-Nat',axiom,
    vB != vNat ).

tff('getTerm-0',axiom,
    ! [Vt: vTerm] : ( vgetTerm(vsomeTerm(Vt)) = Vt ) ).

tff('isNV-0',axiom,
    visNV(vZero) ).

tff('isNV-1',axiom,
    ! [Vnv: vTerm] :
      ( visNV(vSucc(Vnv))
    <=> visNV(Vnv) ) ).

tff('isNV-2',axiom,
    ! [VwildcardName0: vTerm] :
      ( ( ( VwildcardName0 != vZero )
        & ! [Vnv0: vTerm] : ( VwildcardName0 != vSucc(Vnv0) ) )
     => ~ visNV(VwildcardName0) ) ).

tff('isNV-true-INV',axiom,
    ! [VTerm0: vTerm] :
      ( visNV(VTerm0)
     => ( ( VTerm0 = vZero )
        | ? [Vnv: vTerm] :
            ( ( VTerm0 = vSucc(Vnv) )
            & visNV(Vnv) ) ) ) ).

tff('isNV-false-INV',axiom,
    ! [VTerm0: vTerm] :
      ( ~ visNV(VTerm0)
     => ( ? [Vnv: vTerm] :
            ( ( VTerm0 = vSucc(Vnv) )
            & ~ visNV(Vnv) )
        | ? [VwildcardName0: vTerm] :
            ( ( VwildcardName0 != vZero )
            & ! [Vnv0: vTerm] : ( VwildcardName0 != vSucc(Vnv0) )
            & ( VTerm0 = VwildcardName0 ) ) ) ) ).

tff('isValue-0',axiom,
    visValue(vTrue) ).

tff('isValue-1',axiom,
    visValue(vFalse) ).

tff('isValue-2',axiom,
    ! [Vt1: vTerm] :
      ( ( ( Vt1 != vTrue )
        & ( Vt1 != vFalse ) )
     => ( visValue(Vt1)
      <=> visNV(Vt1) ) ) ).

tff('isValue-true-INV',axiom,
    ! [VTerm0: vTerm] :
      ( visValue(VTerm0)
     => ( ( VTerm0 = vTrue )
        | ( VTerm0 = vFalse )
        | ? [Vt1: vTerm] :
            ( ( Vt1 != vTrue )
            & ( Vt1 != vFalse )
            & ( VTerm0 = Vt1 )
            & visNV(Vt1) ) ) ) ).

tff('isValue-false-INV',axiom,
    ! [VTerm0: vTerm] :
      ( ~ visValue(VTerm0)
     => ? [Vt1: vTerm] :
          ( ( Vt1 != vTrue )
          & ( Vt1 != vFalse )
          & ( VTerm0 = Vt1 )
          & ~ visNV(Vt1) ) ) ).

tff('isSomeTerm-0',axiom,
    ~ visSomeTerm(vnoTerm) ).

tff('isSomeTerm-1',axiom,
    ! [VwildcardName0: vTerm] : visSomeTerm(vsomeTerm(VwildcardName0)) ).

tff('isSomeTerm-true-INV',axiom,
    ! [VOptTerm0: vOptTerm] :
      ( visSomeTerm(VOptTerm0)
     => ? [VwildcardName0: vTerm] : ( VOptTerm0 = vsomeTerm(VwildcardName0) ) ) ).

tff('isSomeTerm-false-INV',axiom,
    ! [VOptTerm0: vOptTerm] :
      ( ~ visSomeTerm(VOptTerm0)
     => ( VOptTerm0 = vnoTerm ) ) ).

tff('plusop-0',axiom,
    ! [Vt2: vTerm] : ( vplusop(Vt2,vZero) = Vt2 ) ).

tff('plusop-1',axiom,
    ! [Vt2: vTerm,Vt3: vTerm] : ( vplusop(Vt2,vSucc(Vt3)) = vSucc(vplusop(Vt2,Vt3)) ) ).

tff('plusop-2',axiom,
    ! [Vt3: vTerm,Vt2: vTerm] :
      ( ( ( Vt3 != vZero )
        & ! [Vt30: vTerm] : ( Vt3 != vSucc(Vt30) ) )
     => ( vplusop(Vt2,Vt3) = Vt3 ) ) ).

tff('plusop-INV',axiom,
    ! [VTerm0: vTerm,VTerm1: vTerm] :
      ( ? [Vt20: vTerm] :
          ( ( VTerm0 = Vt20 )
          & ( VTerm1 = vZero )
          & ( vplusop(VTerm0,VTerm1) = Vt20 ) )
      | ? [Vt30: vTerm,Vt21: vTerm] :
          ( ( VTerm0 = Vt21 )
          & ( VTerm1 = vSucc(Vt30) )
          & ( vplusop(VTerm0,VTerm1) = vSucc(vplusop(Vt21,Vt30)) ) )
      | ? [Vt31: vTerm,Vt22: vTerm] :
          ( ( Vt31 != vZero )
          & ! [Vt3000: vTerm] : ( Vt31 != vSucc(Vt3000) )
          & ( VTerm0 = Vt22 )
          & ( VTerm1 = Vt31 )
          & ( vplusop(VTerm0,VTerm1) = Vt31 ) ) ) ).

tff('reduce-0',axiom,
    ! [Vt2: vTerm,Vt3: vTerm] : ( vreduce(vIfelse(vTrue,Vt2,Vt3)) = vsomeTerm(Vt2) ) ).

tff('reduce-1',axiom,
    ! [Vt2: vTerm,Vt3: vTerm] : ( vreduce(vIfelse(vFalse,Vt2,Vt3)) = vsomeTerm(Vt3) ) ).

tff('reduce-2',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,Vt3: vTerm] :
      ( ( ! [Vt200: vTerm,Vt300: vTerm] :
            ( ( Vt1 != vTrue )
            | ( Vt2 != Vt200 )
            | ( Vt3 != Vt300 ) )
        & ! [Vt201: vTerm,Vt301: vTerm] :
            ( ( Vt1 != vFalse )
            | ( Vt2 != Vt201 )
            | ( Vt3 != Vt301 ) )
        & visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vIfelse(Vt1,Vt2,Vt3)) = vsomeTerm(vIfelse(vgetTerm(vreduce(Vt1)),Vt2,Vt3)) ) ) ).

tff('reduce-3',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,Vt3: vTerm] :
      ( ( ! [Vt200: vTerm,Vt300: vTerm] :
            ( ( Vt1 != vTrue )
            | ( Vt2 != Vt200 )
            | ( Vt3 != Vt300 ) )
        & ! [Vt201: vTerm,Vt301: vTerm] :
            ( ( Vt1 != vFalse )
            | ( Vt2 != Vt201 )
            | ( Vt3 != Vt301 ) )
        & ~ visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vIfelse(Vt1,Vt2,Vt3)) = vnoTerm ) ) ).

tff('reduce-4',axiom,
    ! [Vt1: vTerm] :
      ( visSomeTerm(vreduce(Vt1))
     => ( vreduce(vSucc(Vt1)) = vsomeTerm(vSucc(vgetTerm(vreduce(Vt1)))) ) ) ).

tff('reduce-5',axiom,
    ! [Vt1: vTerm] :
      ( ~ visSomeTerm(vreduce(Vt1))
     => ( vreduce(vSucc(Vt1)) = vnoTerm ) ) ).

tff('reduce-6',axiom,
    vreduce(vPred(vZero)) = vsomeTerm(vZero) ).

tff('reduce-7',axiom,
    ! [Vnv: vTerm] :
      ( visNV(Vnv)
     => ( vreduce(vPred(vSucc(Vnv))) = vsomeTerm(Vnv) ) ) ).

tff('reduce-8',axiom,
    ! [Vnv: vTerm] :
      ( ( ~ visNV(Vnv)
        & visSomeTerm(vreduce(vSucc(Vnv))) )
     => ( vreduce(vPred(vSucc(Vnv))) = vsomeTerm(vPred(vgetTerm(vreduce(vSucc(Vnv))))) ) ) ).

tff('reduce-9',axiom,
    ! [Vnv: vTerm] :
      ( ( ~ visNV(Vnv)
        & ~ visSomeTerm(vreduce(vSucc(Vnv))) )
     => ( vreduce(vPred(vSucc(Vnv))) = vnoTerm ) ) ).

tff('reduce-10',axiom,
    ! [Vt1: vTerm] :
      ( ( ( Vt1 != vZero )
        & ! [Vnv00: vTerm] : ( Vt1 != vSucc(Vnv00) )
        & visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vPred(Vt1)) = vsomeTerm(vPred(vgetTerm(vreduce(Vt1)))) ) ) ).

tff('reduce-11',axiom,
    ! [Vt1: vTerm] :
      ( ( ( Vt1 != vZero )
        & ! [Vnv00: vTerm] : ( Vt1 != vSucc(Vnv00) )
        & ~ visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vPred(Vt1)) = vnoTerm ) ) ).

tff('reduce-12',axiom,
    vreduce(vIszero(vZero)) = vsomeTerm(vTrue) ).

tff('reduce-13',axiom,
    ! [Vnv: vTerm] :
      ( visNV(Vnv)
     => ( vreduce(vIszero(vSucc(Vnv))) = vsomeTerm(vFalse) ) ) ).

tff('reduce-14',axiom,
    ! [Vnv: vTerm] :
      ( ( ~ visNV(Vnv)
        & visSomeTerm(vreduce(vSucc(Vnv))) )
     => ( vreduce(vIszero(vSucc(Vnv))) = vsomeTerm(vIszero(vgetTerm(vreduce(vSucc(Vnv))))) ) ) ).

tff('reduce-15',axiom,
    ! [Vnv: vTerm] :
      ( ( ~ visNV(Vnv)
        & ~ visSomeTerm(vreduce(vSucc(Vnv))) )
     => ( vreduce(vIszero(vSucc(Vnv))) = vnoTerm ) ) ).

tff('reduce-16',axiom,
    ! [Vt1: vTerm] :
      ( ( ( Vt1 != vZero )
        & ! [Vnv00: vTerm] : ( Vt1 != vSucc(Vnv00) )
        & visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vIszero(Vt1)) = vsomeTerm(vIszero(vgetTerm(vreduce(Vt1)))) ) ) ).

tff('reduce-17',axiom,
    ! [Vt1: vTerm] :
      ( ( ( Vt1 != vZero )
        & ! [Vnv00: vTerm] : ( Vt1 != vSucc(Vnv00) )
        & ~ visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vIszero(Vt1)) = vnoTerm ) ) ).

tff('reduce-18',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( ( visNV(Vt1)
        & visNV(Vt2) )
     => ( vreduce(vPlus(Vt1,Vt2)) = vsomeTerm(vplusop(Vt1,Vt2)) ) ) ).

tff('reduce-19',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( ( visNV(Vt1)
        & ~ visNV(Vt2)
        & visSomeTerm(vreduce(Vt2)) )
     => ( vreduce(vPlus(Vt1,Vt2)) = vsomeTerm(vPlus(Vt1,vgetTerm(vreduce(Vt2)))) ) ) ).

tff('reduce-20',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( ( visNV(Vt1)
        & ~ visNV(Vt2)
        & ~ visSomeTerm(vreduce(Vt2)) )
     => ( vreduce(vPlus(Vt1,Vt2)) = vnoTerm ) ) ).

tff('reduce-21',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( ( ~ visNV(Vt1)
        & visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vPlus(Vt1,Vt2)) = vsomeTerm(vPlus(vgetTerm(vreduce(Vt1)),Vt2)) ) ) ).

tff('reduce-22',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( ( ~ visNV(Vt1)
        & ~ visSomeTerm(vreduce(Vt1)) )
     => ( vreduce(vPlus(Vt1,Vt2)) = vnoTerm ) ) ).

tff('reduce-23',axiom,
    ! [VwildcardName0: vTerm] :
      ( ( ! [Vt20: vTerm,Vt30: vTerm] : ( VwildcardName0 != vIfelse(vTrue,Vt20,Vt30) )
        & ! [Vt20: vTerm,Vt30: vTerm] : ( VwildcardName0 != vIfelse(vFalse,Vt20,Vt30) )
        & ! [Vt10: vTerm,Vt20: vTerm,Vt30: vTerm] : ( VwildcardName0 != vIfelse(Vt10,Vt20,Vt30) )
        & ! [Vt10: vTerm] : ( VwildcardName0 != vSucc(Vt10) )
        & ( VwildcardName0 != vPred(vZero) )
        & ! [Vnv0: vTerm] : ( VwildcardName0 != vPred(vSucc(Vnv0)) )
        & ! [Vt10: vTerm] : ( VwildcardName0 != vPred(Vt10) )
        & ( VwildcardName0 != vIszero(vZero) )
        & ! [Vnv0: vTerm] : ( VwildcardName0 != vIszero(vSucc(Vnv0)) )
        & ! [Vt10: vTerm] : ( VwildcardName0 != vIszero(Vt10) )
        & ! [Vt10: vTerm,Vt20: vTerm] : ( VwildcardName0 != vPlus(Vt10,Vt20) ) )
     => ( vreduce(VwildcardName0) = vnoTerm ) ) ).

tff('reduce-INV',axiom,
    ! [VTerm0: vTerm] :
      ( ? [Vt20: vTerm,Vt30: vTerm] :
          ( ( VTerm0 = vIfelse(vTrue,Vt20,Vt30) )
          & ( vreduce(VTerm0) = vsomeTerm(Vt20) ) )
      | ? [Vt21: vTerm,Vt31: vTerm] :
          ( ( VTerm0 = vIfelse(vFalse,Vt21,Vt31) )
          & ( vreduce(VTerm0) = vsomeTerm(Vt31) ) )
      | ? [Vt10: vTerm,Vt22: vTerm,Vt32: vTerm,Vot10: vOptTerm] :
          ( ! [Vt2010: vTerm,Vt3010: vTerm] :
              ( ( Vt10 != vTrue )
              | ( Vt22 != Vt2010 )
              | ( Vt32 != Vt3010 ) )
          & ! [Vt2020: vTerm,Vt3020: vTerm] :
              ( ( Vt10 != vFalse )
              | ( Vt22 != Vt2020 )
              | ( Vt32 != Vt3020 ) )
          & ( Vot10 = vreduce(Vt10) )
          & visSomeTerm(Vot10)
          & ( VTerm0 = vIfelse(Vt10,Vt22,Vt32) )
          & ( vreduce(VTerm0) = vsomeTerm(vIfelse(vgetTerm(Vot10),Vt22,Vt32)) ) )
      | ? [Vt11: vTerm,Vt23: vTerm,Vt33: vTerm,Vot11: vOptTerm] :
          ( ! [Vt2030: vTerm,Vt3030: vTerm] :
              ( ( Vt11 != vTrue )
              | ( Vt23 != Vt2030 )
              | ( Vt33 != Vt3030 ) )
          & ! [Vt2040: vTerm,Vt3040: vTerm] :
              ( ( Vt11 != vFalse )
              | ( Vt23 != Vt2040 )
              | ( Vt33 != Vt3040 ) )
          & ( Vot11 = vreduce(Vt11) )
          & ~ visSomeTerm(Vot11)
          & ( VTerm0 = vIfelse(Vt11,Vt23,Vt33) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ? [Vt12: vTerm,Vot20: vOptTerm] :
          ( ( Vot20 = vreduce(Vt12) )
          & visSomeTerm(Vot20)
          & ( VTerm0 = vSucc(Vt12) )
          & ( vreduce(VTerm0) = vsomeTerm(vSucc(vgetTerm(Vot20))) ) )
      | ? [Vt13: vTerm,Vot21: vOptTerm] :
          ( ( Vot21 = vreduce(Vt13) )
          & ~ visSomeTerm(Vot21)
          & ( VTerm0 = vSucc(Vt13) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ( ( VTerm0 = vPred(vZero) )
        & ( vreduce(VTerm0) = vsomeTerm(vZero) ) )
      | ? [Vnv0: vTerm] :
          ( visNV(Vnv0)
          & ( VTerm0 = vPred(vSucc(Vnv0)) )
          & ( vreduce(VTerm0) = vsomeTerm(Vnv0) ) )
      | ? [Vnv1: vTerm,Vot22: vOptTerm] :
          ( ~ visNV(Vnv1)
          & ( Vot22 = vreduce(vSucc(Vnv1)) )
          & visSomeTerm(Vot22)
          & ( VTerm0 = vPred(vSucc(Vnv1)) )
          & ( vreduce(VTerm0) = vsomeTerm(vPred(vgetTerm(Vot22))) ) )
      | ? [Vnv2: vTerm,Vot23: vOptTerm] :
          ( ~ visNV(Vnv2)
          & ( Vot23 = vreduce(vSucc(Vnv2)) )
          & ~ visSomeTerm(Vot23)
          & ( VTerm0 = vPred(vSucc(Vnv2)) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ? [Vt14: vTerm,Vot24: vOptTerm] :
          ( ( Vt14 != vZero )
          & ! [Vnv000: vTerm] : ( Vt14 != vSucc(Vnv000) )
          & ( Vot24 = vreduce(Vt14) )
          & visSomeTerm(Vot24)
          & ( VTerm0 = vPred(Vt14) )
          & ( vreduce(VTerm0) = vsomeTerm(vPred(vgetTerm(Vot24))) ) )
      | ? [Vt15: vTerm,Vot25: vOptTerm] :
          ( ( Vt15 != vZero )
          & ! [Vnv010: vTerm] : ( Vt15 != vSucc(Vnv010) )
          & ( Vot25 = vreduce(Vt15) )
          & ~ visSomeTerm(Vot25)
          & ( VTerm0 = vPred(Vt15) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ( ( VTerm0 = vIszero(vZero) )
        & ( vreduce(VTerm0) = vsomeTerm(vTrue) ) )
      | ? [Vnv3: vTerm] :
          ( visNV(Vnv3)
          & ( VTerm0 = vIszero(vSucc(Vnv3)) )
          & ( vreduce(VTerm0) = vsomeTerm(vFalse) ) )
      | ? [Vnv4: vTerm,Vot26: vOptTerm] :
          ( ~ visNV(Vnv4)
          & ( Vot26 = vreduce(vSucc(Vnv4)) )
          & visSomeTerm(Vot26)
          & ( VTerm0 = vIszero(vSucc(Vnv4)) )
          & ( vreduce(VTerm0) = vsomeTerm(vIszero(vgetTerm(Vot26))) ) )
      | ? [Vnv5: vTerm,Vot27: vOptTerm] :
          ( ~ visNV(Vnv5)
          & ( Vot27 = vreduce(vSucc(Vnv5)) )
          & ~ visSomeTerm(Vot27)
          & ( VTerm0 = vIszero(vSucc(Vnv5)) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ? [Vt16: vTerm,Vot28: vOptTerm] :
          ( ( Vt16 != vZero )
          & ! [Vnv020: vTerm] : ( Vt16 != vSucc(Vnv020) )
          & ( Vot28 = vreduce(Vt16) )
          & visSomeTerm(Vot28)
          & ( VTerm0 = vIszero(Vt16) )
          & ( vreduce(VTerm0) = vsomeTerm(vIszero(vgetTerm(Vot28))) ) )
      | ? [Vt17: vTerm,Vot29: vOptTerm] :
          ( ( Vt17 != vZero )
          & ! [Vnv030: vTerm] : ( Vt17 != vSucc(Vnv030) )
          & ( Vot29 = vreduce(Vt17) )
          & ~ visSomeTerm(Vot29)
          & ( VTerm0 = vIszero(Vt17) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ? [Vt18: vTerm,Vt24: vTerm] :
          ( visNV(Vt18)
          & visNV(Vt24)
          & ( VTerm0 = vPlus(Vt18,Vt24) )
          & ( vreduce(VTerm0) = vsomeTerm(vplusop(Vt18,Vt24)) ) )
      | ? [Vt19: vTerm,Vt25: vTerm,Vot210: vOptTerm] :
          ( visNV(Vt19)
          & ~ visNV(Vt25)
          & ( Vot210 = vreduce(Vt25) )
          & visSomeTerm(Vot210)
          & ( VTerm0 = vPlus(Vt19,Vt25) )
          & ( vreduce(VTerm0) = vsomeTerm(vPlus(Vt19,vgetTerm(Vot210))) ) )
      | ? [Vt110: vTerm,Vt26: vTerm,Vot211: vOptTerm] :
          ( visNV(Vt110)
          & ~ visNV(Vt26)
          & ( Vot211 = vreduce(Vt26) )
          & ~ visSomeTerm(Vot211)
          & ( VTerm0 = vPlus(Vt110,Vt26) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ? [Vt111: vTerm,Vt27: vTerm,Vot12: vOptTerm] :
          ( ~ visNV(Vt111)
          & ( Vot12 = vreduce(Vt111) )
          & visSomeTerm(Vot12)
          & ( VTerm0 = vPlus(Vt111,Vt27) )
          & ( vreduce(VTerm0) = vsomeTerm(vPlus(vgetTerm(Vot12),Vt27)) ) )
      | ? [Vt112: vTerm,Vt28: vTerm,Vot13: vOptTerm] :
          ( ~ visNV(Vt112)
          & ( Vot13 = vreduce(Vt112) )
          & ~ visSomeTerm(Vot13)
          & ( VTerm0 = vPlus(Vt112,Vt28) )
          & ( vreduce(VTerm0) = vnoTerm ) )
      | ? [VwildcardName00: vTerm] :
          ( ! [Vt2050: vTerm,Vt3050: vTerm] : ( VwildcardName00 != vIfelse(vTrue,Vt2050,Vt3050) )
          & ! [Vt2060: vTerm,Vt3060: vTerm] : ( VwildcardName00 != vIfelse(vFalse,Vt2060,Vt3060) )
          & ! [Vt1000: vTerm,Vt2070: vTerm,Vt3070: vTerm] : ( VwildcardName00 != vIfelse(Vt1000,Vt2070,Vt3070) )
          & ! [Vt1010: vTerm] : ( VwildcardName00 != vSucc(Vt1010) )
          & ( VwildcardName00 != vPred(vZero) )
          & ! [Vnv040: vTerm] : ( VwildcardName00 != vPred(vSucc(Vnv040)) )
          & ! [Vt1020: vTerm] : ( VwildcardName00 != vPred(Vt1020) )
          & ( VwildcardName00 != vIszero(vZero) )
          & ! [Vnv050: vTerm] : ( VwildcardName00 != vIszero(vSucc(Vnv050)) )
          & ! [Vt1030: vTerm] : ( VwildcardName00 != vIszero(Vt1030) )
          & ! [Vt1040: vTerm,Vt2080: vTerm] : ( VwildcardName00 != vPlus(Vt1040,Vt2080) )
          & ( VTerm0 = VwildcardName00 )
          & ( vreduce(VTerm0) = vnoTerm ) ) ) ).

tff('Ttrue',axiom,
    vptchecksimple(vTrue,vB) ).

tff('Tfalse',axiom,
    vptchecksimple(vFalse,vB) ).

tff('Tif',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,VT: vTy,Vt3: vTerm] :
      ( ( vptchecksimple(Vt1,vB)
        & vptchecksimple(Vt2,VT)
        & vptchecksimple(Vt3,VT) )
     => vptchecksimple(vIfelse(Vt1,Vt2,Vt3),VT) ) ).

tff('Tif_inv1',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,Vt3: vTerm,VT: vTy] :
      ( vptchecksimple(vIfelse(Vt1,Vt2,Vt3),VT)
     => vptchecksimple(Vt1,vB) ) ).

tff('Tif_inv2',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,Vt3: vTerm,VT: vTy] :
      ( vptchecksimple(vIfelse(Vt1,Vt2,Vt3),VT)
     => vptchecksimple(Vt2,VT) ) ).

tff('Tif_inv3',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,Vt3: vTerm,VT: vTy] :
      ( vptchecksimple(vIfelse(Vt1,Vt2,Vt3),VT)
     => vptchecksimple(Vt3,VT) ) ).

tff('TZero',axiom,
    vptchecksimple(vZero,vNat) ).

tff('TZero_inv',axiom,
    ! [VT: vTy] :
      ( vptchecksimple(vZero,VT)
     => ( VT = vNat ) ) ).

tff('TSucc',axiom,
    ! [Vt1: vTerm] :
      ( vptchecksimple(Vt1,vNat)
     => vptchecksimple(vSucc(Vt1),vNat) ) ).

tff('TSucc_inv1',axiom,
    ! [Vt1: vTerm,VT: vTy] :
      ( vptchecksimple(vSucc(Vt1),VT)
     => ( VT = vNat ) ) ).

tff('TSucc_inv2',axiom,
    ! [Vt1: vTerm] :
      ( vptchecksimple(vSucc(Vt1),vNat)
     => vptchecksimple(Vt1,vNat) ) ).

tff('TPred',axiom,
    ! [Vt1: vTerm] :
      ( vptchecksimple(Vt1,vNat)
     => vptchecksimple(vPred(Vt1),vNat) ) ).

tff('TPred_inv1',axiom,
    ! [Vt1: vTerm] :
      ( vptchecksimple(vPred(Vt1),vNat)
     => vptchecksimple(Vt1,vNat) ) ).

tff('TPred_inv2',axiom,
    ! [Vt1: vTerm,VT: vTy] :
      ( vptchecksimple(vPred(Vt1),VT)
     => ( VT = vNat ) ) ).

tff('Tiszero',axiom,
    ! [Vt1: vTerm] :
      ( vptchecksimple(Vt1,vNat)
     => vptchecksimple(vIszero(Vt1),vB) ) ).

tff('Tiszero_inv1',axiom,
    ! [Vt1: vTerm] :
      ( vptchecksimple(vIszero(Vt1),vB)
     => vptchecksimple(Vt1,vNat) ) ).

tff('Tiszero_inv2',axiom,
    ! [Vt1: vTerm,VT: vTy] :
      ( vptchecksimple(vIszero(Vt1),VT)
     => ( VT = vB ) ) ).

tff('TPlus',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( ( vptchecksimple(Vt1,vNat)
        & vptchecksimple(Vt2,vNat) )
     => vptchecksimple(vPlus(Vt1,Vt2),vNat) ) ).

tff('TPlus_inv0',axiom,
    ! [Vt1: vTerm,Vt2: vTerm,VT: vTy] :
      ( vptchecksimple(vPlus(Vt1,Vt2),VT)
     => ( VT = vNat ) ) ).

tff('TPlus_inv1',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( vptchecksimple(vPlus(Vt1,Vt2),vNat)
     => vptchecksimple(Vt1,vNat) ) ).

tff('TPlus_inv2',axiom,
    ! [Vt1: vTerm,Vt2: vTerm] :
      ( vptchecksimple(vPlus(Vt1,Vt2),vNat)
     => vptchecksimple(Vt2,vNat) ) ).

tff('Preservation-Plus-IH0',axiom,
    ! [VT: vTy,Vtres: vTerm] :
      ( ( vptchecksimple(vt1,VT)
        & ( vreduce(vt1) = vsomeTerm(Vtres) ) )
     => vptchecksimple(Vtres,VT) ) ).

tff('Preservation-Plus-IH1',axiom,
    ! [VT: vTy,Vtres: vTerm] :
      ( ( vptchecksimple(vt2,VT)
        & ( vreduce(vt2) = vsomeTerm(Vtres) ) )
     => vptchecksimple(Vtres,VT) ) ).

tff(isNVisNat,axiom,
    ! [Vt: vTerm] :
      ( visNV(Vt)
     => vptchecksimple(Vt,vNat) ) ).

tff('Preservation-Plus-isNV-False-isSomeTerm-False',conjecture,
    ! [VT: vTy,Vtres: vTerm] :
      ( ( ~ visSomeTerm(vreduce(vt1))
        & ~ visNV(vt1)
        & vptchecksimple(vPlus(vt1,vt2),VT)
        & ( vreduce(vPlus(vt1,vt2)) = vsomeTerm(Vtres) ) )
     => vptchecksimple(Vtres,VT) ) ).

%------------------------------------------------------------------------------