KILLED proof of input_mxRyM5xhLf.trs # AProVE Commit ID: aff8ecad908e01718a4c36e68d2e55d5e0f16e15 fuhs 20220216 unpublished The Runtime Complexity (parallel-innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). (0) CpxRelTRS (1) SInnermostTerminationProof [BOTH CONCRETE BOUNDS(ID, ID), 511 ms] (2) CpxRelTRS (3) RenamingProof [BOTH BOUNDS(ID, ID), 0 ms] (4) CpxRelTRS (5) RelTrsToTrsProof [UPPER BOUND(ID), 0 ms] (6) CpxTRS (7) CpxTrsToCdtProof [BOTH BOUNDS(ID, ID), 60 ms] (8) CdtProblem (9) CdtToCpxRelTrsProof [BOTH BOUNDS(ID, ID), 0 ms] (10) CpxRelTRS (11) RelTrsToDecreasingLoopProblemProof [LOWER BOUND(ID), 0 ms] (12) TRS for Loop Detection (13) RenamingProof [BOTH BOUNDS(ID, ID), 0 ms] (14) CpxRelTRS (15) TypeInferenceProof [BOTH BOUNDS(ID, ID), 0 ms] (16) typed CpxTrs (17) RelTrsToWeightedTrsProof [UPPER BOUND(ID), 0 ms] (18) CpxWeightedTrs (19) TypeInferenceProof [BOTH BOUNDS(ID, ID), 0 ms] (20) CpxTypedWeightedTrs (21) CompletionProof [UPPER BOUND(ID), 0 ms] (22) CpxTypedWeightedCompleteTrs (23) NarrowingProof [BOTH BOUNDS(ID, ID), 65 ms] (24) CpxTypedWeightedCompleteTrs (25) CpxTypedWeightedTrsToRntsProof [UPPER BOUND(ID), 7 ms] (26) CpxRNTS (27) InliningProof [UPPER BOUND(ID), 374 ms] (28) CpxRNTS (29) SimplificationProof [BOTH BOUNDS(ID, ID), 29 ms] (30) CpxRNTS (31) CompletionProof [UPPER BOUND(ID), 0 ms] (32) CpxTypedWeightedCompleteTrs (33) CpxTypedWeightedTrsToRntsProof [UPPER BOUND(ID), 0 ms] (34) CpxRNTS (35) CpxTrsToCdtProof [UPPER BOUND(ID), 0 ms] (36) CdtProblem (37) CdtLeafRemovalProof [ComplexityIfPolyImplication, 0 ms] (38) CdtProblem (39) CdtRhsSimplificationProcessorProof [BOTH BOUNDS(ID, ID), 0 ms] (40) CdtProblem (41) CdtUsableRulesProof [BOTH BOUNDS(ID, ID), 0 ms] (42) CdtProblem (43) CdtToCpxRelTrsProof [BOTH BOUNDS(ID, ID), 0 ms] (44) CpxRelTRS (45) RelTrsToTrsProof [UPPER BOUND(ID), 0 ms] (46) CpxTRS (47) RelTrsToWeightedTrsProof [BOTH BOUNDS(ID, ID), 0 ms] (48) CpxWeightedTrs (49) TypeInferenceProof [BOTH BOUNDS(ID, ID), 0 ms] (50) CpxTypedWeightedTrs (51) CompletionProof [UPPER BOUND(ID), 0 ms] (52) CpxTypedWeightedCompleteTrs (53) NarrowingProof [BOTH BOUNDS(ID, ID), 35 ms] (54) CpxTypedWeightedCompleteTrs (55) CpxTypedWeightedTrsToRntsProof [UPPER BOUND(ID), 0 ms] (56) CpxRNTS (57) InliningProof [UPPER BOUND(ID), 364 ms] (58) CpxRNTS (59) SimplificationProof [BOTH BOUNDS(ID, ID), 0 ms] (60) CpxRNTS (61) CompletionProof [UPPER BOUND(ID), 0 ms] (62) CpxTypedWeightedCompleteTrs (63) CpxTypedWeightedTrsToRntsProof [UPPER BOUND(ID), 8 ms] (64) CpxRNTS (65) CdtRuleRemovalProof [UPPER BOUND(ADD(n^1)), 156 ms] (66) CdtProblem (67) CdtRuleRemovalProof [UPPER BOUND(ADD(n^1)), 97 ms] (68) CdtProblem (69) CdtNarrowingProof [BOTH BOUNDS(ID, ID), 0 ms] (70) CdtProblem (71) CdtNarrowingProof [BOTH BOUNDS(ID, ID), 0 ms] (72) CdtProblem (73) CdtRhsSimplificationProcessorProof [BOTH BOUNDS(ID, ID), 0 ms] (74) CdtProblem (75) CdtNarrowingProof [BOTH BOUNDS(ID, ID), 0 ms] (76) CdtProblem (77) CdtNarrowingProof [BOTH BOUNDS(ID, ID), 0 ms] (78) CdtProblem (79) CdtNarrowingProof [BOTH BOUNDS(ID, ID), 0 ms] (80) CdtProblem (81) CdtNarrowingProof [BOTH BOUNDS(ID, ID), 0 ms] (82) CdtProblem (83) CdtRhsSimplificationProcessorProof [BOTH BOUNDS(ID, ID), 0 ms] (84) CdtProblem (85) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (86) CdtProblem (87) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (88) CdtProblem (89) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (90) CdtProblem (91) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (92) CdtProblem (93) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (94) CdtProblem (95) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (96) CdtProblem (97) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (98) CdtProblem (99) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (100) CdtProblem (101) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (102) CdtProblem (103) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (104) CdtProblem (105) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (106) CdtProblem (107) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (108) CdtProblem (109) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (110) CdtProblem (111) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (112) CdtProblem (113) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (114) CdtProblem (115) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (116) CdtProblem (117) CdtInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (118) CdtProblem (119) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (120) CdtProblem (121) CdtRhsSimplificationProcessorProof [BOTH BOUNDS(ID, ID), 0 ms] (122) CdtProblem (123) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (124) CdtProblem (125) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (126) CdtProblem (127) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (128) CdtProblem (129) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 1 ms] (130) CdtProblem (131) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (132) CdtProblem (133) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (134) CdtProblem (135) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (136) CdtProblem (137) CdtRewritingProof [BOTH BOUNDS(ID, ID), 17 ms] (138) CdtProblem (139) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 3 ms] (140) CdtProblem (141) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (142) CdtProblem (143) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (144) CdtProblem (145) CdtRewritingProof [BOTH BOUNDS(ID, ID), 14 ms] (146) CdtProblem (147) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (148) CdtProblem (149) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (150) CdtProblem (151) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (152) CdtProblem (153) CdtRewritingProof [BOTH BOUNDS(ID, ID), 0 ms] (154) CdtProblem (155) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 11 ms] (156) CdtProblem (157) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (158) CdtProblem (159) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (160) CdtProblem (161) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 13 ms] (162) CdtProblem (163) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 34 ms] (164) CdtProblem (165) CdtForwardInstantiationProof [BOTH BOUNDS(ID, ID), 0 ms] (166) CdtProblem ---------------------------------------- (0) Obligation: The Runtime Complexity (parallel-innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) red(Lam(int, term)) -> Lam(int, term) subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) red(V(int)) -> V(int) eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) eqTerm(App(t11, t12), Lam(i2, l2)) -> False eqTerm(App(t11, t12), V(v2)) -> False eqTerm(Lam(i1, l1), App(t21, t22)) -> False eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) eqTerm(Lam(i1, l1), V(v2)) -> False eqTerm(V(v1), App(t21, t22)) -> False eqTerm(V(v1), Lam(i2, l2)) -> False eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) mklam(V(name), e) -> Lam(name, e) lamvar(Lam(var, exp)) -> V(var) lambody(Lam(var, exp)) -> exp isvar(App(t1, t2)) -> False isvar(Lam(int, term)) -> False isvar(V(int)) -> True islam(App(t1, t2)) -> False islam(Lam(int, term)) -> True islam(V(int)) -> False appe2(App(e1, e2)) -> e2 appe1(App(e1, e2)) -> e1 mkapp(e1, e2) -> App(e1, e2) lambdaint(e) -> red(e) The (relative) TRS S consists of the following rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(x), S(y)) -> !EQ(x, y) !EQ(0, S(y)) -> False !EQ(S(x), 0) -> False !EQ(0, 0) -> True red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) red[Let][Let](e, V(int), e2) -> App(V(int), e2) red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) subst[True][Ite](True, x, a, e) -> e subst[Ite](False, x, a, e) -> e subst[Ite](True, x, a, e) -> a Rewrite Strategy: PARALLEL_INNERMOST ---------------------------------------- (1) SInnermostTerminationProof (BOTH CONCRETE BOUNDS(ID, ID)) proved innermost termination of relative rules ---------------------------------------- (2) Obligation: The Runtime Complexity (parallel-innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) red(Lam(int, term)) -> Lam(int, term) subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) red(V(int)) -> V(int) eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) eqTerm(App(t11, t12), Lam(i2, l2)) -> False eqTerm(App(t11, t12), V(v2)) -> False eqTerm(Lam(i1, l1), App(t21, t22)) -> False eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) eqTerm(Lam(i1, l1), V(v2)) -> False eqTerm(V(v1), App(t21, t22)) -> False eqTerm(V(v1), Lam(i2, l2)) -> False eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) mklam(V(name), e) -> Lam(name, e) lamvar(Lam(var, exp)) -> V(var) lambody(Lam(var, exp)) -> exp isvar(App(t1, t2)) -> False isvar(Lam(int, term)) -> False isvar(V(int)) -> True islam(App(t1, t2)) -> False islam(Lam(int, term)) -> True islam(V(int)) -> False appe2(App(e1, e2)) -> e2 appe1(App(e1, e2)) -> e1 mkapp(e1, e2) -> App(e1, e2) lambdaint(e) -> red(e) The (relative) TRS S consists of the following rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(x), S(y)) -> !EQ(x, y) !EQ(0, S(y)) -> False !EQ(S(x), 0) -> False !EQ(0, 0) -> True red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) red[Let][Let](e, V(int), e2) -> App(V(int), e2) red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) subst[True][Ite](True, x, a, e) -> e subst[Ite](False, x, a, e) -> e subst[Ite](True, x, a, e) -> a Rewrite Strategy: PARALLEL_INNERMOST ---------------------------------------- (3) RenamingProof (BOTH BOUNDS(ID, ID)) Renamed function symbols to avoid clashes with predefined symbol. ---------------------------------------- (4) Obligation: The Runtime Complexity (parallel-innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) red(Lam(int, term)) -> Lam(int, term) subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) red(V(int)) -> V(int) eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) eqTerm(App(t11, t12), Lam(i2, l2)) -> False eqTerm(App(t11, t12), V(v2)) -> False eqTerm(Lam(i1, l1), App(t21, t22)) -> False eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) eqTerm(Lam(i1, l1), V(v2)) -> False eqTerm(V(v1), App(t21, t22)) -> False eqTerm(V(v1), Lam(i2, l2)) -> False eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) mklam(V(name), e) -> Lam(name, e) lamvar(Lam(var, exp)) -> V(var) lambody(Lam(var, exp)) -> exp isvar(App(t1, t2)) -> False isvar(Lam(int, term)) -> False isvar(V(int)) -> True islam(App(t1, t2)) -> False islam(Lam(int, term)) -> True islam(V(int)) -> False appe2(App(e1, e2)) -> e2 appe1(App(e1, e2)) -> e1 mkapp(e1, e2) -> App(e1, e2) lambdaint(e) -> red(e) The (relative) TRS S consists of the following rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(x), S(y)) -> !EQ(x, y) !EQ(0', S(y)) -> False !EQ(S(x), 0') -> False !EQ(0', 0') -> True red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) red[Let][Let](e, V(int), e2) -> App(V(int), e2) red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) subst[True][Ite](True, x, a, e) -> e subst[Ite](False, x, a, e) -> e subst[Ite](True, x, a, e) -> a Rewrite Strategy: PARALLEL_INNERMOST ---------------------------------------- (5) RelTrsToTrsProof (UPPER BOUND(ID)) transformed relative TRS to TRS ---------------------------------------- (6) Obligation: The Runtime Complexity (parallel-innermost) of the given CpxTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) red(Lam(int, term)) -> Lam(int, term) subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) red(V(int)) -> V(int) eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) eqTerm(App(t11, t12), Lam(i2, l2)) -> False eqTerm(App(t11, t12), V(v2)) -> False eqTerm(Lam(i1, l1), App(t21, t22)) -> False eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) eqTerm(Lam(i1, l1), V(v2)) -> False eqTerm(V(v1), App(t21, t22)) -> False eqTerm(V(v1), Lam(i2, l2)) -> False eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) mklam(V(name), e) -> Lam(name, e) lamvar(Lam(var, exp)) -> V(var) lambody(Lam(var, exp)) -> exp isvar(App(t1, t2)) -> False isvar(Lam(int, term)) -> False isvar(V(int)) -> True islam(App(t1, t2)) -> False islam(Lam(int, term)) -> True islam(V(int)) -> False appe2(App(e1, e2)) -> e2 appe1(App(e1, e2)) -> e1 mkapp(e1, e2) -> App(e1, e2) lambdaint(e) -> red(e) and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(x), S(y)) -> !EQ(x, y) !EQ(0, S(y)) -> False !EQ(S(x), 0) -> False !EQ(0, 0) -> True red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) red[Let][Let](e, V(int), e2) -> App(V(int), e2) red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) subst[True][Ite](True, x, a, e) -> e subst[Ite](False, x, a, e) -> e subst[Ite](True, x, a, e) -> a S is empty. Rewrite Strategy: PARALLEL_INNERMOST ---------------------------------------- (7) CpxTrsToCdtProof (BOTH BOUNDS(ID, ID)) Converted Cpx (relative) TRS with rewrite strategy PARALLEL_INNERMOST to CDT ---------------------------------------- (8) Obligation: Complexity Dependency Tuples Problem Rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Tuples: AND(False, False) -> c AND(True, False) -> c1 AND(False, True) -> c2 AND(True, True) -> c3 !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) !EQ'(0, S(z0)) -> c5 !EQ'(S(z0), 0) -> c6 !EQ'(0, 0) -> c7 RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) RED[LET][LET](z0, App(z1, z2), z3) -> c9 RED[LET][LET](z0, V(z1), z2) -> c10 SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST[ITE](False, z0, z1, z2) -> c14 SUBST[ITE](True, z0, z1, z2) -> c15 SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) S tuples: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) K tuples:none Defined Rule Symbols: subst_3, red_1, eqTerm_2, mklam_2, lamvar_1, lambody_1, isvar_1, islam_1, appe2_1, appe1_1, mkapp_2, lambdaint_1, and_2, !EQ_2, red[Let][Let]_3, subst[True][Ite]_4, red[Let]_2, subst[Ite]_4 Defined Pair Symbols: AND_2, !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST[ITE]_4, SUBST_3, RED_1, EQTERM_2, MKLAM_2, LAMVAR_1, LAMBODY_1, ISVAR_1, ISLAM_1, APPE2_1, APPE1_1, MKAPP_2, LAMBDAINT_1 Compound Symbols: c, c1, c2, c3, c4_1, c5, c6, c7, c8_2, c9, c10, c11_2, c12, c13_2, c14, c15, c16_2, c17_2, c18_2, c19_2, c20_2, c21, c22, c23_2, c24_2, c25, c26, c27, c28_2, c29_2, c30, c31, c32, c33_1, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44, c45, c46_1 ---------------------------------------- (9) CdtToCpxRelTrsProof (BOTH BOUNDS(ID, ID)) Converted S to standard rules, and D \ S as well as R to relative rules. ---------------------------------------- (10) Obligation: The Runtime Complexity (innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) The (relative) TRS S consists of the following rules: AND(False, False) -> c AND(True, False) -> c1 AND(False, True) -> c2 AND(True, True) -> c3 !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) !EQ'(0, S(z0)) -> c5 !EQ'(S(z0), 0) -> c6 !EQ'(0, 0) -> c7 RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) RED[LET][LET](z0, App(z1, z2), z3) -> c9 RED[LET][LET](z0, V(z1), z2) -> c10 SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST[ITE](False, z0, z1, z2) -> c14 SUBST[ITE](True, z0, z1, z2) -> c15 and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Rewrite Strategy: INNERMOST ---------------------------------------- (11) RelTrsToDecreasingLoopProblemProof (LOWER BOUND(ID)) Transformed a relative TRS into a decreasing-loop problem. ---------------------------------------- (12) Obligation: Analyzing the following TRS for decreasing loops: The Runtime Complexity (innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) The (relative) TRS S consists of the following rules: AND(False, False) -> c AND(True, False) -> c1 AND(False, True) -> c2 AND(True, True) -> c3 !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) !EQ'(0, S(z0)) -> c5 !EQ'(S(z0), 0) -> c6 !EQ'(0, 0) -> c7 RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) RED[LET][LET](z0, App(z1, z2), z3) -> c9 RED[LET][LET](z0, V(z1), z2) -> c10 SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST[ITE](False, z0, z1, z2) -> c14 SUBST[ITE](True, z0, z1, z2) -> c15 and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Rewrite Strategy: INNERMOST ---------------------------------------- (13) RenamingProof (BOTH BOUNDS(ID, ID)) Renamed function symbols to avoid clashes with predefined symbol. ---------------------------------------- (14) Obligation: The Runtime Complexity (innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) The (relative) TRS S consists of the following rules: AND(False, False) -> c AND(True, False) -> c1 AND(False, True) -> c2 AND(True, True) -> c3 !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) !EQ'(0', S(z0)) -> c5 !EQ'(S(z0), 0') -> c6 !EQ'(0', 0') -> c7 RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) RED[LET][LET](z0, App(z1, z2), z3) -> c9 RED[LET][LET](z0, V(z1), z2) -> c10 SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST[ITE](False, z0, z1, z2) -> c14 SUBST[ITE](True, z0, z1, z2) -> c15 and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0', S(z0)) -> False !EQ(S(z0), 0') -> False !EQ(0', 0') -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Rewrite Strategy: INNERMOST ---------------------------------------- (15) TypeInferenceProof (BOTH BOUNDS(ID, ID)) Inferred types. ---------------------------------------- (16) Obligation: Innermost TRS: Rules: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) AND(False, False) -> c AND(True, False) -> c1 AND(False, True) -> c2 AND(True, True) -> c3 !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) !EQ'(0', S(z0)) -> c5 !EQ'(S(z0), 0') -> c6 !EQ'(0', 0') -> c7 RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) RED[LET][LET](z0, App(z1, z2), z3) -> c9 RED[LET][LET](z0, V(z1), z2) -> c10 SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST[ITE](False, z0, z1, z2) -> c14 SUBST[ITE](True, z0, z1, z2) -> c15 and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0', S(z0)) -> False !EQ(S(z0), 0') -> False !EQ(0', 0') -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Types: SUBST :: App:Lam:V -> App:Lam:V -> App:Lam:V -> c16:c17:c18:c19 App :: App:Lam:V -> App:Lam:V -> App:Lam:V c16 :: c45 -> c16:c17:c18:c19 -> c16:c17:c18:c19 MKAPP :: App:Lam:V -> App:Lam:V -> c45 subst :: App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V c17 :: c45 -> c16:c17:c18:c19 -> c16:c17:c18:c19 Lam :: S:0' -> App:Lam:V -> App:Lam:V c18 :: c11:c12 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 -> c16:c17:c18:c19 SUBST[TRUE][ITE] :: False:True -> App:Lam:V -> App:Lam:V -> App:Lam:V -> c11:c12 eqTerm :: App:Lam:V -> App:Lam:V -> False:True V :: S:0' -> App:Lam:V EQTERM :: App:Lam:V -> App:Lam:V -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c19 :: c14:c15 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 -> c16:c17:c18:c19 SUBST[ITE] :: False:True -> App:Lam:V -> App:Lam:V -> App:Lam:V -> c14:c15 RED :: App:Lam:V -> c20:c21:c22 c20 :: c13 -> c20:c21:c22 -> c20:c21:c22 RED[LET] :: App:Lam:V -> App:Lam:V -> c13 red :: App:Lam:V -> App:Lam:V c21 :: c20:c21:c22 c22 :: c20:c21:c22 c23 :: c:c1:c2:c3 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 AND :: False:True -> False:True -> c:c1:c2:c3 c24 :: c:c1:c2:c3 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c25 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c26 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c27 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c28 :: c:c1:c2:c3 -> c4:c5:c6:c7 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 !EQ :: S:0' -> S:0' -> False:True !EQ' :: S:0' -> S:0' -> c4:c5:c6:c7 c29 :: c:c1:c2:c3 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c30 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c31 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c32 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 c33 :: c4:c5:c6:c7 -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 MKLAM :: App:Lam:V -> App:Lam:V -> c34 c34 :: c34 LAMVAR :: App:Lam:V -> c35 c35 :: c35 LAMBODY :: App:Lam:V -> c36 c36 :: c36 ISVAR :: App:Lam:V -> c37:c38:c39 c37 :: c37:c38:c39 c38 :: c37:c38:c39 c39 :: c37:c38:c39 ISLAM :: App:Lam:V -> c40:c41:c42 c40 :: c40:c41:c42 c41 :: c40:c41:c42 c42 :: c40:c41:c42 APPE2 :: App:Lam:V -> c43 c43 :: c43 APPE1 :: App:Lam:V -> c44 c44 :: c44 c45 :: c45 LAMBDAINT :: App:Lam:V -> c46 c46 :: c20:c21:c22 -> c46 False :: False:True c :: c:c1:c2:c3 True :: False:True c1 :: c:c1:c2:c3 c2 :: c:c1:c2:c3 c3 :: c:c1:c2:c3 S :: S:0' -> S:0' c4 :: c4:c5:c6:c7 -> c4:c5:c6:c7 0' :: S:0' c5 :: c4:c5:c6:c7 c6 :: c4:c5:c6:c7 c7 :: c4:c5:c6:c7 RED[LET][LET] :: App:Lam:V -> App:Lam:V -> App:Lam:V -> c8:c9:c10 c8 :: c20:c21:c22 -> c16:c17:c18:c19 -> c8:c9:c10 c9 :: c8:c9:c10 c10 :: c8:c9:c10 c11 :: c34 -> c16:c17:c18:c19 -> c11:c12 c12 :: c11:c12 c13 :: c8:c9:c10 -> c20:c21:c22 -> c13 c14 :: c14:c15 c15 :: c14:c15 and :: False:True -> False:True -> False:True red[Let][Let] :: App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V subst[True][Ite] :: False:True -> App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V mklam :: App:Lam:V -> App:Lam:V -> App:Lam:V red[Let] :: App:Lam:V -> App:Lam:V -> App:Lam:V subst[Ite] :: False:True -> App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V mkapp :: App:Lam:V -> App:Lam:V -> App:Lam:V lamvar :: App:Lam:V -> App:Lam:V lambody :: App:Lam:V -> App:Lam:V isvar :: App:Lam:V -> False:True islam :: App:Lam:V -> False:True appe2 :: App:Lam:V -> App:Lam:V appe1 :: App:Lam:V -> App:Lam:V lambdaint :: App:Lam:V -> App:Lam:V hole_c16:c17:c18:c191_47 :: c16:c17:c18:c19 hole_App:Lam:V2_47 :: App:Lam:V hole_c453_47 :: c45 hole_S:0'4_47 :: S:0' hole_c11:c125_47 :: c11:c12 hole_c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c336_47 :: c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 hole_False:True7_47 :: False:True hole_c14:c158_47 :: c14:c15 hole_c20:c21:c229_47 :: c20:c21:c22 hole_c1310_47 :: c13 hole_c:c1:c2:c311_47 :: c:c1:c2:c3 hole_c4:c5:c6:c712_47 :: c4:c5:c6:c7 hole_c3413_47 :: c34 hole_c3514_47 :: c35 hole_c3615_47 :: c36 hole_c37:c38:c3916_47 :: c37:c38:c39 hole_c40:c41:c4217_47 :: c40:c41:c42 hole_c4318_47 :: c43 hole_c4419_47 :: c44 hole_c4620_47 :: c46 hole_c8:c9:c1021_47 :: c8:c9:c10 gen_c16:c17:c18:c1922_47 :: Nat -> c16:c17:c18:c19 gen_App:Lam:V23_47 :: Nat -> App:Lam:V gen_S:0'24_47 :: Nat -> S:0' gen_c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c3325_47 :: Nat -> c23:c24:c25:c26:c27:c28:c29:c30:c31:c32:c33 gen_c20:c21:c2226_47 :: Nat -> c20:c21:c22 gen_c4:c5:c6:c727_47 :: Nat -> c4:c5:c6:c7 ---------------------------------------- (17) RelTrsToWeightedTrsProof (UPPER BOUND(ID)) Transformed relative TRS to weighted TRS ---------------------------------------- (18) Obligation: The Runtime Complexity (innermost) of the given CpxWeightedTrs could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) [1] subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) [1] red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) [1] red(Lam(int, term)) -> Lam(int, term) [1] subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) [1] red(V(int)) -> V(int) [1] eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) [1] eqTerm(App(t11, t12), Lam(i2, l2)) -> False [1] eqTerm(App(t11, t12), V(v2)) -> False [1] eqTerm(Lam(i1, l1), App(t21, t22)) -> False [1] eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) [1] eqTerm(Lam(i1, l1), V(v2)) -> False [1] eqTerm(V(v1), App(t21, t22)) -> False [1] eqTerm(V(v1), Lam(i2, l2)) -> False [1] eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) [1] mklam(V(name), e) -> Lam(name, e) [1] lamvar(Lam(var, exp)) -> V(var) [1] lambody(Lam(var, exp)) -> exp [1] isvar(App(t1, t2)) -> False [1] isvar(Lam(int, term)) -> False [1] isvar(V(int)) -> True [1] islam(App(t1, t2)) -> False [1] islam(Lam(int, term)) -> True [1] islam(V(int)) -> False [1] appe2(App(e1, e2)) -> e2 [1] appe1(App(e1, e2)) -> e1 [1] mkapp(e1, e2) -> App(e1, e2) [1] lambdaint(e) -> red(e) [1] and(False, False) -> False [0] and(True, False) -> False [0] and(False, True) -> False [0] and(True, True) -> True [0] !EQ(S(x), S(y)) -> !EQ(x, y) [0] !EQ(0, S(y)) -> False [0] !EQ(S(x), 0) -> False [0] !EQ(0, 0) -> True [0] red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) [0] subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) [0] red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) [0] red[Let][Let](e, V(int), e2) -> App(V(int), e2) [0] red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) [0] subst[True][Ite](True, x, a, e) -> e [0] subst[Ite](False, x, a, e) -> e [0] subst[Ite](True, x, a, e) -> a [0] Rewrite Strategy: INNERMOST ---------------------------------------- (19) TypeInferenceProof (BOTH BOUNDS(ID, ID)) Infered types. ---------------------------------------- (20) Obligation: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) [1] subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) [1] red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) [1] red(Lam(int, term)) -> Lam(int, term) [1] subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) [1] red(V(int)) -> V(int) [1] eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) [1] eqTerm(App(t11, t12), Lam(i2, l2)) -> False [1] eqTerm(App(t11, t12), V(v2)) -> False [1] eqTerm(Lam(i1, l1), App(t21, t22)) -> False [1] eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) [1] eqTerm(Lam(i1, l1), V(v2)) -> False [1] eqTerm(V(v1), App(t21, t22)) -> False [1] eqTerm(V(v1), Lam(i2, l2)) -> False [1] eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) [1] mklam(V(name), e) -> Lam(name, e) [1] lamvar(Lam(var, exp)) -> V(var) [1] lambody(Lam(var, exp)) -> exp [1] isvar(App(t1, t2)) -> False [1] isvar(Lam(int, term)) -> False [1] isvar(V(int)) -> True [1] islam(App(t1, t2)) -> False [1] islam(Lam(int, term)) -> True [1] islam(V(int)) -> False [1] appe2(App(e1, e2)) -> e2 [1] appe1(App(e1, e2)) -> e1 [1] mkapp(e1, e2) -> App(e1, e2) [1] lambdaint(e) -> red(e) [1] and(False, False) -> False [0] and(True, False) -> False [0] and(False, True) -> False [0] and(True, True) -> True [0] !EQ(S(x), S(y)) -> !EQ(x, y) [0] !EQ(0, S(y)) -> False [0] !EQ(S(x), 0) -> False [0] !EQ(0, 0) -> True [0] red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) [0] subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) [0] red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) [0] red[Let][Let](e, V(int), e2) -> App(V(int), e2) [0] red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) [0] subst[True][Ite](True, x, a, e) -> e [0] subst[Ite](False, x, a, e) -> e [0] subst[Ite](True, x, a, e) -> a [0] The TRS has the following type information: subst :: App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V App :: App:Lam:V -> App:Lam:V -> App:Lam:V mkapp :: App:Lam:V -> App:Lam:V -> App:Lam:V Lam :: S:0 -> App:Lam:V -> App:Lam:V subst[True][Ite] :: False:True -> App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V eqTerm :: App:Lam:V -> App:Lam:V -> False:True V :: S:0 -> App:Lam:V red :: App:Lam:V -> App:Lam:V red[Let] :: App:Lam:V -> App:Lam:V -> App:Lam:V subst[Ite] :: False:True -> App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V and :: False:True -> False:True -> False:True False :: False:True !EQ :: S:0 -> S:0 -> False:True mklam :: App:Lam:V -> App:Lam:V -> App:Lam:V lamvar :: App:Lam:V -> App:Lam:V lambody :: App:Lam:V -> App:Lam:V isvar :: App:Lam:V -> False:True True :: False:True islam :: App:Lam:V -> False:True appe2 :: App:Lam:V -> App:Lam:V appe1 :: App:Lam:V -> App:Lam:V lambdaint :: App:Lam:V -> App:Lam:V S :: S:0 -> S:0 0 :: S:0 red[Let][Let] :: App:Lam:V -> App:Lam:V -> App:Lam:V -> App:Lam:V Rewrite Strategy: INNERMOST ---------------------------------------- (21) CompletionProof (UPPER BOUND(ID)) The transformation into a RNTS is sound, since: (a) The obligation is a constructor system where every type has a constant constructor, (b) The following defined symbols do not have to be completely defined, as they can never occur inside other defined symbols: lamvar_1 lambody_1 isvar_1 islam_1 appe2_1 appe1_1 lambdaint_1 (c) The following functions are completely defined: subst_3 eqTerm_2 red_1 mkapp_2 mklam_2 and_2 !EQ_2 red[Let][Let]_3 subst[True][Ite]_4 red[Let]_2 subst[Ite]_4 Due to the following rules being added: and(v0, v1) -> null_and [0] !EQ(v0, v1) -> null_!EQ [0] red[Let][Let](v0, v1, v2) -> const [0] subst[True][Ite](v0, v1, v2, v3) -> const [0] red[Let](v0, v1) -> const [0] subst[Ite](v0, v1, v2, v3) -> const [0] subst(v0, v1, v2) -> const [0] eqTerm(v0, v1) -> null_eqTerm [0] red(v0) -> const [0] mklam(v0, v1) -> const [0] And the following fresh constants: null_and, null_!EQ, const, null_eqTerm ---------------------------------------- (22) Obligation: Runtime Complexity Weighted TRS where critical functions are completely defined. The underlying TRS is: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) [1] subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) [1] red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) [1] red(Lam(int, term)) -> Lam(int, term) [1] subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) [1] red(V(int)) -> V(int) [1] eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) [1] eqTerm(App(t11, t12), Lam(i2, l2)) -> False [1] eqTerm(App(t11, t12), V(v2)) -> False [1] eqTerm(Lam(i1, l1), App(t21, t22)) -> False [1] eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) [1] eqTerm(Lam(i1, l1), V(v2)) -> False [1] eqTerm(V(v1), App(t21, t22)) -> False [1] eqTerm(V(v1), Lam(i2, l2)) -> False [1] eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) [1] mklam(V(name), e) -> Lam(name, e) [1] lamvar(Lam(var, exp)) -> V(var) [1] lambody(Lam(var, exp)) -> exp [1] isvar(App(t1, t2)) -> False [1] isvar(Lam(int, term)) -> False [1] isvar(V(int)) -> True [1] islam(App(t1, t2)) -> False [1] islam(Lam(int, term)) -> True [1] islam(V(int)) -> False [1] appe2(App(e1, e2)) -> e2 [1] appe1(App(e1, e2)) -> e1 [1] mkapp(e1, e2) -> App(e1, e2) [1] lambdaint(e) -> red(e) [1] and(False, False) -> False [0] and(True, False) -> False [0] and(False, True) -> False [0] and(True, True) -> True [0] !EQ(S(x), S(y)) -> !EQ(x, y) [0] !EQ(0, S(y)) -> False [0] !EQ(S(x), 0) -> False [0] !EQ(0, 0) -> True [0] red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) [0] subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) [0] red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) [0] red[Let][Let](e, V(int), e2) -> App(V(int), e2) [0] red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) [0] subst[True][Ite](True, x, a, e) -> e [0] subst[Ite](False, x, a, e) -> e [0] subst[Ite](True, x, a, e) -> a [0] and(v0, v1) -> null_and [0] !EQ(v0, v1) -> null_!EQ [0] red[Let][Let](v0, v1, v2) -> const [0] subst[True][Ite](v0, v1, v2, v3) -> const [0] red[Let](v0, v1) -> const [0] subst[Ite](v0, v1, v2, v3) -> const [0] subst(v0, v1, v2) -> const [0] eqTerm(v0, v1) -> null_eqTerm [0] red(v0) -> const [0] mklam(v0, v1) -> const [0] The TRS has the following type information: subst :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const App :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const mkapp :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const Lam :: S:0 -> App:Lam:V:const -> App:Lam:V:const subst[True][Ite] :: False:True:null_and:null_!EQ:null_eqTerm -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const eqTerm :: App:Lam:V:const -> App:Lam:V:const -> False:True:null_and:null_!EQ:null_eqTerm V :: S:0 -> App:Lam:V:const red :: App:Lam:V:const -> App:Lam:V:const red[Let] :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const subst[Ite] :: False:True:null_and:null_!EQ:null_eqTerm -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const and :: False:True:null_and:null_!EQ:null_eqTerm -> False:True:null_and:null_!EQ:null_eqTerm -> False:True:null_and:null_!EQ:null_eqTerm False :: False:True:null_and:null_!EQ:null_eqTerm !EQ :: S:0 -> S:0 -> False:True:null_and:null_!EQ:null_eqTerm mklam :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const lamvar :: App:Lam:V:const -> App:Lam:V:const lambody :: App:Lam:V:const -> App:Lam:V:const isvar :: App:Lam:V:const -> False:True:null_and:null_!EQ:null_eqTerm True :: False:True:null_and:null_!EQ:null_eqTerm islam :: App:Lam:V:const -> False:True:null_and:null_!EQ:null_eqTerm appe2 :: App:Lam:V:const -> App:Lam:V:const appe1 :: App:Lam:V:const -> App:Lam:V:const lambdaint :: App:Lam:V:const -> App:Lam:V:const S :: S:0 -> S:0 0 :: S:0 red[Let][Let] :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const null_and :: False:True:null_and:null_!EQ:null_eqTerm null_!EQ :: False:True:null_and:null_!EQ:null_eqTerm const :: App:Lam:V:const null_eqTerm :: False:True:null_and:null_!EQ:null_eqTerm Rewrite Strategy: INNERMOST ---------------------------------------- (23) NarrowingProof (BOTH BOUNDS(ID, ID)) Narrowed the inner basic terms of all right-hand sides by a single narrowing step. ---------------------------------------- (24) Obligation: Runtime Complexity Weighted TRS where critical functions are completely defined. The underlying TRS is: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: subst(x, a, App(App(e1', e2'), App(e1'', e2''))) -> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), mkapp(subst(x, a, e1''), subst(x, a, e2''))) [3] subst(x, a, App(App(e1', e2'), Lam(var'', exp''))) -> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), subst[True][Ite](eqTerm(x, V(var'')), x, a, Lam(var'', exp''))) [3] subst(x, a, App(App(e1', e2'), V(int''))) -> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), subst[Ite](eqTerm(x, V(int'')), x, a, V(int''))) [3] subst(x, a, App(App(e1', e2'), e2)) -> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), const) [2] subst(x, a, App(Lam(var', exp'), App(e11, e21))) -> mkapp(subst[True][Ite](eqTerm(x, V(var')), x, a, Lam(var', exp')), mkapp(subst(x, a, e11), subst(x, a, e21))) [3] subst(x, a, App(Lam(var', exp'), Lam(var1, exp1))) -> mkapp(subst[True][Ite](eqTerm(x, V(var')), x, a, Lam(var', exp')), subst[True][Ite](eqTerm(x, V(var1)), x, a, Lam(var1, exp1))) [3] subst(x, a, App(Lam(var', exp'), V(int1))) -> mkapp(subst[True][Ite](eqTerm(x, V(var')), x, a, Lam(var', exp')), subst[Ite](eqTerm(x, V(int1)), x, a, V(int1))) [3] subst(x, a, App(Lam(var', exp'), e2)) -> mkapp(subst[True][Ite](eqTerm(x, V(var')), x, a, Lam(var', exp')), const) [2] subst(x, a, App(V(int'), App(e12, e22))) -> mkapp(subst[Ite](eqTerm(x, V(int')), x, a, V(int')), mkapp(subst(x, a, e12), subst(x, a, e22))) [3] subst(x, a, App(V(int'), Lam(var2, exp2))) -> mkapp(subst[Ite](eqTerm(x, V(int')), x, a, V(int')), subst[True][Ite](eqTerm(x, V(var2)), x, a, Lam(var2, exp2))) [3] subst(x, a, App(V(int'), V(int2))) -> mkapp(subst[Ite](eqTerm(x, V(int')), x, a, V(int')), subst[Ite](eqTerm(x, V(int2)), x, a, V(int2))) [3] subst(x, a, App(V(int'), e2)) -> mkapp(subst[Ite](eqTerm(x, V(int')), x, a, V(int')), const) [2] subst(x, a, App(e1, App(e13, e23))) -> mkapp(const, mkapp(subst(x, a, e13), subst(x, a, e23))) [2] subst(x, a, App(e1, Lam(var3, exp3))) -> mkapp(const, subst[True][Ite](eqTerm(x, V(var3)), x, a, Lam(var3, exp3))) [2] subst(x, a, App(e1, V(int3))) -> mkapp(const, subst[Ite](eqTerm(x, V(int3)), x, a, V(int3))) [2] subst(x, a, App(e1, e2)) -> mkapp(const, const) [1] subst(App(t11', t12'), a, Lam(var, exp)) -> subst[True][Ite](False, App(t11', t12'), a, Lam(var, exp)) [2] subst(Lam(i1', l1'), a, Lam(var, exp)) -> subst[True][Ite](False, Lam(i1', l1'), a, Lam(var, exp)) [2] subst(V(v1'), a, Lam(var, exp)) -> subst[True][Ite](!EQ(v1', var), V(v1'), a, Lam(var, exp)) [2] subst(x, a, Lam(var, exp)) -> subst[True][Ite](null_eqTerm, x, a, Lam(var, exp)) [1] red(App(App(e14, e24), e2)) -> red[Let](App(App(e14, e24), e2), red[Let](App(e14, e24), red(e14))) [2] red(App(Lam(int4, term'), e2)) -> red[Let](App(Lam(int4, term'), e2), Lam(int4, term')) [2] red(App(V(int5), e2)) -> red[Let](App(V(int5), e2), V(int5)) [2] red(App(e1, e2)) -> red[Let](App(e1, e2), const) [1] red(Lam(int, term)) -> Lam(int, term) [1] subst(App(t11'', t12''), a, V(int)) -> subst[Ite](False, App(t11'', t12''), a, V(int)) [2] subst(Lam(i1'', l1''), a, V(int)) -> subst[Ite](False, Lam(i1'', l1''), a, V(int)) [2] subst(V(v1''), a, V(int)) -> subst[Ite](!EQ(v1'', int), V(v1''), a, V(int)) [2] subst(x, a, V(int)) -> subst[Ite](null_eqTerm, x, a, V(int)) [1] red(V(int)) -> V(int) [1] eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) [1] eqTerm(App(t11, t12), Lam(i2, l2)) -> False [1] eqTerm(App(t11, t12), V(v2)) -> False [1] eqTerm(Lam(i1, l1), App(t21, t22)) -> False [1] eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) [1] eqTerm(Lam(i1, l1), V(v2)) -> False [1] eqTerm(V(v1), App(t21, t22)) -> False [1] eqTerm(V(v1), Lam(i2, l2)) -> False [1] eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) [1] mklam(V(name), e) -> Lam(name, e) [1] lamvar(Lam(var, exp)) -> V(var) [1] lambody(Lam(var, exp)) -> exp [1] isvar(App(t1, t2)) -> False [1] isvar(Lam(int, term)) -> False [1] isvar(V(int)) -> True [1] islam(App(t1, t2)) -> False [1] islam(Lam(int, term)) -> True [1] islam(V(int)) -> False [1] appe2(App(e1, e2)) -> e2 [1] appe1(App(e1, e2)) -> e1 [1] mkapp(e1, e2) -> App(e1, e2) [1] lambdaint(e) -> red(e) [1] and(False, False) -> False [0] and(True, False) -> False [0] and(False, True) -> False [0] and(True, True) -> True [0] !EQ(S(x), S(y)) -> !EQ(x, y) [0] !EQ(0, S(y)) -> False [0] !EQ(S(x), 0) -> False [0] !EQ(0, 0) -> True [0] red[Let][Let](e, Lam(var, App(e15, e25)), a) -> red(mkapp(subst(V(var), a, e15), subst(V(var), a, e25))) [1] red[Let][Let](e, Lam(var, Lam(var4, exp4)), a) -> red(subst[True][Ite](eqTerm(V(var), V(var4)), V(var), a, Lam(var4, exp4))) [1] red[Let][Let](e, Lam(var, V(int6)), a) -> red(subst[Ite](eqTerm(V(var), V(int6)), V(var), a, V(int6))) [1] red[Let][Let](e, Lam(var, exp), a) -> red(const) [0] subst[True][Ite](False, x, a, Lam(var, App(e16, e26))) -> mklam(V(var), mkapp(subst(x, a, e16), subst(x, a, e26))) [1] subst[True][Ite](False, x, a, Lam(var, Lam(var5, exp5))) -> mklam(V(var), subst[True][Ite](eqTerm(x, V(var5)), x, a, Lam(var5, exp5))) [1] subst[True][Ite](False, x, a, Lam(var, V(int7))) -> mklam(V(var), subst[Ite](eqTerm(x, V(int7)), x, a, V(int7))) [1] subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), const) [0] red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) [0] red[Let][Let](e, V(int), e2) -> App(V(int), e2) [0] red[Let](App(e1, App(e17, e27)), f) -> red[Let][Let](App(e1, App(e17, e27)), f, red[Let](App(e17, e27), red(e17))) [1] red[Let](App(e1, Lam(int8, term'')), f) -> red[Let][Let](App(e1, Lam(int8, term'')), f, Lam(int8, term'')) [1] red[Let](App(e1, V(int9)), f) -> red[Let][Let](App(e1, V(int9)), f, V(int9)) [1] red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, const) [0] subst[True][Ite](True, x, a, e) -> e [0] subst[Ite](False, x, a, e) -> e [0] subst[Ite](True, x, a, e) -> a [0] and(v0, v1) -> null_and [0] !EQ(v0, v1) -> null_!EQ [0] red[Let][Let](v0, v1, v2) -> const [0] subst[True][Ite](v0, v1, v2, v3) -> const [0] red[Let](v0, v1) -> const [0] subst[Ite](v0, v1, v2, v3) -> const [0] subst(v0, v1, v2) -> const [0] eqTerm(v0, v1) -> null_eqTerm [0] red(v0) -> const [0] mklam(v0, v1) -> const [0] The TRS has the following type information: subst :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const App :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const mkapp :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const Lam :: S:0 -> App:Lam:V:const -> App:Lam:V:const subst[True][Ite] :: False:True:null_and:null_!EQ:null_eqTerm -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const eqTerm :: App:Lam:V:const -> App:Lam:V:const -> False:True:null_and:null_!EQ:null_eqTerm V :: S:0 -> App:Lam:V:const red :: App:Lam:V:const -> App:Lam:V:const red[Let] :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const subst[Ite] :: False:True:null_and:null_!EQ:null_eqTerm -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const and :: False:True:null_and:null_!EQ:null_eqTerm -> False:True:null_and:null_!EQ:null_eqTerm -> False:True:null_and:null_!EQ:null_eqTerm False :: False:True:null_and:null_!EQ:null_eqTerm !EQ :: S:0 -> S:0 -> False:True:null_and:null_!EQ:null_eqTerm mklam :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const lamvar :: App:Lam:V:const -> App:Lam:V:const lambody :: App:Lam:V:const -> App:Lam:V:const isvar :: App:Lam:V:const -> False:True:null_and:null_!EQ:null_eqTerm True :: False:True:null_and:null_!EQ:null_eqTerm islam :: App:Lam:V:const -> False:True:null_and:null_!EQ:null_eqTerm appe2 :: App:Lam:V:const -> App:Lam:V:const appe1 :: App:Lam:V:const -> App:Lam:V:const lambdaint :: App:Lam:V:const -> App:Lam:V:const S :: S:0 -> S:0 0 :: S:0 red[Let][Let] :: App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const -> App:Lam:V:const null_and :: False:True:null_and:null_!EQ:null_eqTerm null_!EQ :: False:True:null_and:null_!EQ:null_eqTerm const :: App:Lam:V:const null_eqTerm :: False:True:null_and:null_!EQ:null_eqTerm Rewrite Strategy: INNERMOST ---------------------------------------- (25) CpxTypedWeightedTrsToRntsProof (UPPER BOUND(ID)) Transformed the TRS into an over-approximating RNTS by (improved) Size Abstraction. The constant constructors are abstracted as follows: False => 1 True => 2 0 => 0 null_and => 0 null_!EQ => 0 const => 0 null_eqTerm => 0 ---------------------------------------- (26) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z' = 1 + y, y >= 0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: x >= 0, z = 1 + x, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ(z, z') -{ 0 }-> !EQ(x, y) :|: z' = 1 + y, x >= 0, y >= 0, z = 1 + x and(z, z') -{ 0 }-> 2 :|: z = 2, z' = 2 and(z, z') -{ 0 }-> 1 :|: z = 1, z' = 1 and(z, z') -{ 0 }-> 1 :|: z = 2, z' = 1 and(z, z') -{ 0 }-> 1 :|: z' = 2, z = 1 and(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 appe1(z) -{ 1 }-> e1 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 appe2(z) -{ 1 }-> e2 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 eqTerm(z, z') -{ 1 }-> and(eqTerm(t11, t21), eqTerm(t12, t22)) :|: z' = 1 + t21 + t22, t11 >= 0, t21 >= 0, t12 >= 0, z = 1 + t11 + t12, t22 >= 0 eqTerm(z, z') -{ 1 }-> and(!EQ(i1, i2), eqTerm(l1, l2)) :|: i1 >= 0, z' = 1 + i2 + l2, l1 >= 0, i2 >= 0, l2 >= 0, z = 1 + i1 + l1 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + i2 + l2, t11 >= 0, t12 >= 0, i2 >= 0, l2 >= 0, z = 1 + t11 + t12 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + v2, t11 >= 0, t12 >= 0, z = 1 + t11 + t12, v2 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + t21 + t22, t21 >= 0, l1 >= 0, z = 1 + i1 + l1, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + v2, l1 >= 0, z = 1 + i1 + l1, v2 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z = 1 + v1, z' = 1 + t21 + t22, v1 >= 0, t21 >= 0, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z = 1 + v1, z' = 1 + i2 + l2, v1 >= 0, i2 >= 0, l2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 eqTerm(z, z') -{ 1 }-> !EQ(v1, v2) :|: z' = 1 + v2, z = 1 + v1, v1 >= 0, v2 >= 0 islam(z) -{ 1 }-> 2 :|: term >= 0, z = 1 + int + term, int >= 0 islam(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 islam(z) -{ 1 }-> 1 :|: int >= 0, z = 1 + int isvar(z) -{ 1 }-> 2 :|: int >= 0, z = 1 + int isvar(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 isvar(z) -{ 1 }-> 1 :|: term >= 0, z = 1 + int + term, int >= 0 lambdaint(z) -{ 1 }-> red(e) :|: z = e, e >= 0 lambody(z) -{ 1 }-> exp :|: var >= 0, z = 1 + var + exp, exp >= 0 lamvar(z) -{ 1 }-> 1 + var :|: var >= 0, z = 1 + var + exp, exp >= 0 mkapp(z, z') -{ 1 }-> 1 + e1 + e2 :|: z' = e2, z = e1, e1 >= 0, e2 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 1 }-> 1 + name + e :|: z' = e, z = 1 + name, e >= 0, name >= 0 red(z) -{ 1 }-> red[Let](1 + e1 + e2, 0) :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + int5) + e2, 1 + int5) :|: z = 1 + (1 + int5) + e2, int5 >= 0, e2 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + e14 + e24) + e2, red[Let](1 + e14 + e24, red(e14))) :|: e24 >= 0, z = 1 + (1 + e14 + e24) + e2, e2 >= 0, e14 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + int4 + term') + e2, 1 + int4 + term') :|: term' >= 0, int4 >= 0, z = 1 + (1 + int4 + term') + e2, e2 >= 0 red(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 red(z) -{ 1 }-> 1 + int :|: int >= 0, z = 1 + int red(z) -{ 1 }-> 1 + int + term :|: term >= 0, z = 1 + int + term, int >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + e1 + e2, f, 0) :|: f >= 0, z' = f, e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + int9), f, 1 + int9) :|: f >= 0, z = 1 + e1 + (1 + int9), z' = f, int9 >= 0, e1 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + e17 + e27), f, red[Let](1 + e17 + e27, red(e17))) :|: f >= 0, e17 >= 0, e27 >= 0, z' = f, z = 1 + e1 + (1 + e17 + e27), e1 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + int8 + term''), f, 1 + int8 + term'') :|: z = 1 + e1 + (1 + int8 + term''), f >= 0, term'' >= 0, z' = f, e1 >= 0, int8 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 red[Let][Let](z, z', z'') -{ 1 }-> red(subst[True][Ite](eqTerm(1 + var, 1 + var4), 1 + var, a, 1 + var4 + exp4)) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + (1 + var4 + exp4), var4 >= 0, exp4 >= 0, e >= 0 red[Let][Let](z, z', z'') -{ 1 }-> red(subst[Ite](eqTerm(1 + var, 1 + int6), 1 + var, a, 1 + int6)) :|: z = e, var >= 0, int6 >= 0, a >= 0, z'' = a, e >= 0, z' = 1 + var + (1 + int6) red[Let][Let](z, z', z'') -{ 1 }-> red(mkapp(subst(1 + var, a, e15), subst(1 + var, a, e25))) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + (1 + e15 + e25), e >= 0, e25 >= 0, e15 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(0) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + exp, e >= 0, exp >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + int) + e2 :|: z = e, e >= 0, int >= 0, e2 >= 0, z' = 1 + int, z'' = e2 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + t1 + t2) + e2 :|: z = e, z' = 1 + t1 + t2, t1 >= 0, e >= 0, e2 >= 0, t2 >= 0, z'' = e2 subst(z, z', z'') -{ 2 }-> subst[True][Ite](1, 1 + i1' + l1', a, 1 + var + exp) :|: i1' >= 0, z = 1 + i1' + l1', z' = a, var >= 0, l1' >= 0, a >= 0, z'' = 1 + var + exp, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](1, 1 + t11' + t12', a, 1 + var + exp) :|: z' = a, t11' >= 0, var >= 0, a >= 0, z'' = 1 + var + exp, z = 1 + t11' + t12', t12' >= 0, exp >= 0 subst(z, z', z'') -{ 1 }-> subst[True][Ite](0, x, a, 1 + var + exp) :|: z' = a, var >= 0, a >= 0, z'' = 1 + var + exp, x >= 0, z = x, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](!EQ(v1', var), 1 + v1', a, 1 + var + exp) :|: z' = a, var >= 0, a >= 0, z'' = 1 + var + exp, v1' >= 0, z = 1 + v1', exp >= 0 subst(z, z', z'') -{ 2 }-> subst[Ite](1, 1 + i1'' + l1'', a, 1 + int) :|: l1'' >= 0, z' = a, z'' = 1 + int, a >= 0, z = 1 + i1'' + l1'', i1'' >= 0, int >= 0 subst(z, z', z'') -{ 2 }-> subst[Ite](1, 1 + t11'' + t12'', a, 1 + int) :|: t12'' >= 0, z' = a, z'' = 1 + int, z = 1 + t11'' + t12'', a >= 0, int >= 0, t11'' >= 0 subst(z, z', z'') -{ 1 }-> subst[Ite](0, x, a, 1 + int) :|: z' = a, z'' = 1 + int, a >= 0, x >= 0, z = x, int >= 0 subst(z, z', z'') -{ 2 }-> subst[Ite](!EQ(v1'', int), 1 + v1'', a, 1 + int) :|: z' = a, z'' = 1 + int, a >= 0, v1'' >= 0, z = 1 + v1'', int >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), subst[True][Ite](eqTerm(x, 1 + var1), x, a, 1 + var1 + exp1)) :|: z'' = 1 + (1 + var' + exp') + (1 + var1 + exp1), z' = a, exp' >= 0, a >= 0, var1 >= 0, x >= 0, exp1 >= 0, z = x, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), subst[Ite](eqTerm(x, 1 + int1), x, a, 1 + int1)) :|: z' = a, z'' = 1 + (1 + var' + exp') + (1 + int1), exp' >= 0, a >= 0, x >= 0, int1 >= 0, z = x, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), mkapp(subst(x, a, e11), subst(x, a, e21))) :|: z' = a, exp' >= 0, a >= 0, e21 >= 0, x >= 0, e11 >= 0, z = x, z'' = 1 + (1 + var' + exp') + (1 + e11 + e21), var' >= 0 subst(z, z', z'') -{ 2 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), 0) :|: z' = a, exp' >= 0, a >= 0, z'' = 1 + (1 + var' + exp') + e2, x >= 0, z = x, e2 >= 0, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), subst[True][Ite](eqTerm(x, 1 + var2), x, a, 1 + var2 + exp2)) :|: int' >= 0, var2 >= 0, exp2 >= 0, z'' = 1 + (1 + int') + (1 + var2 + exp2), z' = a, a >= 0, x >= 0, z = x subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), subst[Ite](eqTerm(x, 1 + int2), x, a, 1 + int2)) :|: int' >= 0, z' = a, int2 >= 0, a >= 0, x >= 0, z'' = 1 + (1 + int') + (1 + int2), z = x subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), mkapp(subst(x, a, e12), subst(x, a, e22))) :|: int' >= 0, z' = a, a >= 0, x >= 0, e22 >= 0, z'' = 1 + (1 + int') + (1 + e12 + e22), e12 >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), 0) :|: z'' = 1 + (1 + int') + e2, int' >= 0, z' = a, a >= 0, x >= 0, z = x, e2 >= 0 subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), subst[True][Ite](eqTerm(x, 1 + var''), x, a, 1 + var'' + exp'')) :|: z' = a, e1' >= 0, exp'' >= 0, a >= 0, var'' >= 0, x >= 0, e2' >= 0, z = x, z'' = 1 + (1 + e1' + e2') + (1 + var'' + exp'') subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), subst[Ite](eqTerm(x, 1 + int''), x, a, 1 + int'')) :|: z' = a, e1' >= 0, a >= 0, x >= 0, z'' = 1 + (1 + e1' + e2') + (1 + int''), int'' >= 0, e2' >= 0, z = x subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), mkapp(subst(x, a, e1''), subst(x, a, e2''))) :|: z' = a, e1' >= 0, a >= 0, x >= 0, e1'' >= 0, z'' = 1 + (1 + e1' + e2') + (1 + e1'' + e2''), e2' >= 0, e2'' >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), 0) :|: z' = a, e1' >= 0, a >= 0, x >= 0, z'' = 1 + (1 + e1' + e2') + e2, e2' >= 0, z = x, e2 >= 0 subst(z, z', z'') -{ 2 }-> mkapp(0, subst[True][Ite](eqTerm(x, 1 + var3), x, a, 1 + var3 + exp3)) :|: z' = a, z'' = 1 + e1 + (1 + var3 + exp3), a >= 0, var3 >= 0, exp3 >= 0, x >= 0, e1 >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(0, subst[Ite](eqTerm(x, 1 + int3), x, a, 1 + int3)) :|: int3 >= 0, z' = a, a >= 0, z'' = 1 + e1 + (1 + int3), x >= 0, e1 >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(0, mkapp(subst(x, a, e13), subst(x, a, e23))) :|: e13 >= 0, z' = a, z'' = 1 + e1 + (1 + e13 + e23), a >= 0, x >= 0, e1 >= 0, e23 >= 0, z = x subst(z, z', z'') -{ 1 }-> mkapp(0, 0) :|: z' = a, z'' = 1 + e1 + e2, a >= 0, x >= 0, e1 >= 0, z = x, e2 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> a :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> e :|: z' = x, z1 = e, a >= 0, z = 1, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> e :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, subst[True][Ite](eqTerm(x, 1 + var5), x, a, 1 + var5 + exp5)) :|: z' = x, var >= 0, a >= 0, exp5 >= 0, z = 1, z'' = a, x >= 0, var5 >= 0, z1 = 1 + var + (1 + var5 + exp5) subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, subst[Ite](eqTerm(x, 1 + int7), x, a, 1 + int7)) :|: int7 >= 0, z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, z1 = 1 + var + (1 + int7) subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, mkapp(subst(x, a, e16), subst(x, a, e26))) :|: z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, e26 >= 0, e16 >= 0, z1 = 1 + var + (1 + e16 + e26) subst[True][Ite](z, z', z'', z1) -{ 0 }-> mklam(1 + var, 0) :|: z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, z1 = 1 + var + exp, exp >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 ---------------------------------------- (27) InliningProof (UPPER BOUND(ID)) Inlined the following terminating rules on right-hand sides where appropriate: mklam(z, z') -{ 1 }-> 1 + name + e :|: z' = e, z = 1 + name, e >= 0, name >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mkapp(z, z') -{ 1 }-> 1 + e1 + e2 :|: z' = e2, z = e1, e1 >= 0, e2 >= 0 and(z, z') -{ 0 }-> 2 :|: z = 2, z' = 2 and(z, z') -{ 0 }-> 1 :|: z = 2, z' = 1 and(z, z') -{ 0 }-> 1 :|: z' = 2, z = 1 and(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 and(z, z') -{ 0 }-> 1 :|: z = 1, z' = 1 subst[Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> a :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> e :|: z' = x, z1 = e, a >= 0, z = 1, z'' = a, x >= 0, e >= 0 ---------------------------------------- (28) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z' = 1 + y, y >= 0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: x >= 0, z = 1 + x, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ(z, z') -{ 0 }-> !EQ(x, y) :|: z' = 1 + y, x >= 0, y >= 0, z = 1 + x and(z, z') -{ 0 }-> 2 :|: z = 2, z' = 2 and(z, z') -{ 0 }-> 1 :|: z = 1, z' = 1 and(z, z') -{ 0 }-> 1 :|: z = 2, z' = 1 and(z, z') -{ 0 }-> 1 :|: z' = 2, z = 1 and(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 appe1(z) -{ 1 }-> e1 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 appe2(z) -{ 1 }-> e2 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 eqTerm(z, z') -{ 1 }-> and(eqTerm(t11, t21), eqTerm(t12, t22)) :|: z' = 1 + t21 + t22, t11 >= 0, t21 >= 0, t12 >= 0, z = 1 + t11 + t12, t22 >= 0 eqTerm(z, z') -{ 1 }-> and(!EQ(i1, i2), eqTerm(l1, l2)) :|: i1 >= 0, z' = 1 + i2 + l2, l1 >= 0, i2 >= 0, l2 >= 0, z = 1 + i1 + l1 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + i2 + l2, t11 >= 0, t12 >= 0, i2 >= 0, l2 >= 0, z = 1 + t11 + t12 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + v2, t11 >= 0, t12 >= 0, z = 1 + t11 + t12, v2 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + t21 + t22, t21 >= 0, l1 >= 0, z = 1 + i1 + l1, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + v2, l1 >= 0, z = 1 + i1 + l1, v2 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z = 1 + v1, z' = 1 + t21 + t22, v1 >= 0, t21 >= 0, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z = 1 + v1, z' = 1 + i2 + l2, v1 >= 0, i2 >= 0, l2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 eqTerm(z, z') -{ 1 }-> !EQ(v1, v2) :|: z' = 1 + v2, z = 1 + v1, v1 >= 0, v2 >= 0 islam(z) -{ 1 }-> 2 :|: term >= 0, z = 1 + int + term, int >= 0 islam(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 islam(z) -{ 1 }-> 1 :|: int >= 0, z = 1 + int isvar(z) -{ 1 }-> 2 :|: int >= 0, z = 1 + int isvar(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 isvar(z) -{ 1 }-> 1 :|: term >= 0, z = 1 + int + term, int >= 0 lambdaint(z) -{ 1 }-> red(e) :|: z = e, e >= 0 lambody(z) -{ 1 }-> exp :|: var >= 0, z = 1 + var + exp, exp >= 0 lamvar(z) -{ 1 }-> 1 + var :|: var >= 0, z = 1 + var + exp, exp >= 0 mkapp(z, z') -{ 1 }-> 1 + e1 + e2 :|: z' = e2, z = e1, e1 >= 0, e2 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 1 }-> 1 + name + e :|: z' = e, z = 1 + name, e >= 0, name >= 0 red(z) -{ 1 }-> red[Let](1 + e1 + e2, 0) :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + int5) + e2, 1 + int5) :|: z = 1 + (1 + int5) + e2, int5 >= 0, e2 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + e14 + e24) + e2, red[Let](1 + e14 + e24, red(e14))) :|: e24 >= 0, z = 1 + (1 + e14 + e24) + e2, e2 >= 0, e14 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + int4 + term') + e2, 1 + int4 + term') :|: term' >= 0, int4 >= 0, z = 1 + (1 + int4 + term') + e2, e2 >= 0 red(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 red(z) -{ 1 }-> 1 + int :|: int >= 0, z = 1 + int red(z) -{ 1 }-> 1 + int + term :|: term >= 0, z = 1 + int + term, int >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + e1 + e2, f, 0) :|: f >= 0, z' = f, e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + int9), f, 1 + int9) :|: f >= 0, z = 1 + e1 + (1 + int9), z' = f, int9 >= 0, e1 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + e17 + e27), f, red[Let](1 + e17 + e27, red(e17))) :|: f >= 0, e17 >= 0, e27 >= 0, z' = f, z = 1 + e1 + (1 + e17 + e27), e1 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + int8 + term''), f, 1 + int8 + term'') :|: z = 1 + e1 + (1 + int8 + term''), f >= 0, term'' >= 0, z' = f, e1 >= 0, int8 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 red[Let][Let](z, z', z'') -{ 1 }-> red(subst[True][Ite](eqTerm(1 + var, 1 + var4), 1 + var, a, 1 + var4 + exp4)) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + (1 + var4 + exp4), var4 >= 0, exp4 >= 0, e >= 0 red[Let][Let](z, z', z'') -{ 1 }-> red(subst[Ite](eqTerm(1 + var, 1 + int6), 1 + var, a, 1 + int6)) :|: z = e, var >= 0, int6 >= 0, a >= 0, z'' = a, e >= 0, z' = 1 + var + (1 + int6) red[Let][Let](z, z', z'') -{ 1 }-> red(mkapp(subst(1 + var, a, e15), subst(1 + var, a, e25))) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + (1 + e15 + e25), e >= 0, e25 >= 0, e15 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(0) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + exp, e >= 0, exp >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + int) + e2 :|: z = e, e >= 0, int >= 0, e2 >= 0, z' = 1 + int, z'' = e2 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + t1 + t2) + e2 :|: z = e, z' = 1 + t1 + t2, t1 >= 0, e >= 0, e2 >= 0, t2 >= 0, z'' = e2 subst(z, z', z'') -{ 2 }-> e :|: t12'' >= 0, z' = a, z'' = 1 + int, z = 1 + t11'' + t12'', a >= 0, int >= 0, t11'' >= 0, 1 + t11'' + t12'' = x, 1 + int = e, a' >= 0, 1 = 1, a = a', x >= 0, e >= 0 subst(z, z', z'') -{ 2 }-> e :|: l1'' >= 0, z' = a, z'' = 1 + int, a >= 0, z = 1 + i1'' + l1'', i1'' >= 0, int >= 0, 1 + i1'' + l1'' = x, 1 + int = e, a' >= 0, 1 = 1, a = a', x >= 0, e >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](1, 1 + i1' + l1', a, 1 + var + exp) :|: i1' >= 0, z = 1 + i1' + l1', z' = a, var >= 0, l1' >= 0, a >= 0, z'' = 1 + var + exp, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](1, 1 + t11' + t12', a, 1 + var + exp) :|: z' = a, t11' >= 0, var >= 0, a >= 0, z'' = 1 + var + exp, z = 1 + t11' + t12', t12' >= 0, exp >= 0 subst(z, z', z'') -{ 1 }-> subst[True][Ite](0, x, a, 1 + var + exp) :|: z' = a, var >= 0, a >= 0, z'' = 1 + var + exp, x >= 0, z = x, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](!EQ(v1', var), 1 + v1', a, 1 + var + exp) :|: z' = a, var >= 0, a >= 0, z'' = 1 + var + exp, v1' >= 0, z = 1 + v1', exp >= 0 subst(z, z', z'') -{ 2 }-> subst[Ite](!EQ(v1'', int), 1 + v1'', a, 1 + int) :|: z' = a, z'' = 1 + int, a >= 0, v1'' >= 0, z = 1 + v1'', int >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), subst[True][Ite](eqTerm(x, 1 + var1), x, a, 1 + var1 + exp1)) :|: z'' = 1 + (1 + var' + exp') + (1 + var1 + exp1), z' = a, exp' >= 0, a >= 0, var1 >= 0, x >= 0, exp1 >= 0, z = x, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), subst[Ite](eqTerm(x, 1 + int1), x, a, 1 + int1)) :|: z' = a, z'' = 1 + (1 + var' + exp') + (1 + int1), exp' >= 0, a >= 0, x >= 0, int1 >= 0, z = x, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), mkapp(subst(x, a, e11), subst(x, a, e21))) :|: z' = a, exp' >= 0, a >= 0, e21 >= 0, x >= 0, e11 >= 0, z = x, z'' = 1 + (1 + var' + exp') + (1 + e11 + e21), var' >= 0 subst(z, z', z'') -{ 2 }-> mkapp(subst[True][Ite](eqTerm(x, 1 + var'), x, a, 1 + var' + exp'), 0) :|: z' = a, exp' >= 0, a >= 0, z'' = 1 + (1 + var' + exp') + e2, x >= 0, z = x, e2 >= 0, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), subst[True][Ite](eqTerm(x, 1 + var2), x, a, 1 + var2 + exp2)) :|: int' >= 0, var2 >= 0, exp2 >= 0, z'' = 1 + (1 + int') + (1 + var2 + exp2), z' = a, a >= 0, x >= 0, z = x subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), subst[Ite](eqTerm(x, 1 + int2), x, a, 1 + int2)) :|: int' >= 0, z' = a, int2 >= 0, a >= 0, x >= 0, z'' = 1 + (1 + int') + (1 + int2), z = x subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), mkapp(subst(x, a, e12), subst(x, a, e22))) :|: int' >= 0, z' = a, a >= 0, x >= 0, e22 >= 0, z'' = 1 + (1 + int') + (1 + e12 + e22), e12 >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(subst[Ite](eqTerm(x, 1 + int'), x, a, 1 + int'), 0) :|: z'' = 1 + (1 + int') + e2, int' >= 0, z' = a, a >= 0, x >= 0, z = x, e2 >= 0 subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), subst[True][Ite](eqTerm(x, 1 + var''), x, a, 1 + var'' + exp'')) :|: z' = a, e1' >= 0, exp'' >= 0, a >= 0, var'' >= 0, x >= 0, e2' >= 0, z = x, z'' = 1 + (1 + e1' + e2') + (1 + var'' + exp'') subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), subst[Ite](eqTerm(x, 1 + int''), x, a, 1 + int'')) :|: z' = a, e1' >= 0, a >= 0, x >= 0, z'' = 1 + (1 + e1' + e2') + (1 + int''), int'' >= 0, e2' >= 0, z = x subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), mkapp(subst(x, a, e1''), subst(x, a, e2''))) :|: z' = a, e1' >= 0, a >= 0, x >= 0, e1'' >= 0, z'' = 1 + (1 + e1' + e2') + (1 + e1'' + e2''), e2' >= 0, e2'' >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(mkapp(subst(x, a, e1'), subst(x, a, e2')), 0) :|: z' = a, e1' >= 0, a >= 0, x >= 0, z'' = 1 + (1 + e1' + e2') + e2, e2' >= 0, z = x, e2 >= 0 subst(z, z', z'') -{ 2 }-> mkapp(0, subst[True][Ite](eqTerm(x, 1 + var3), x, a, 1 + var3 + exp3)) :|: z' = a, z'' = 1 + e1 + (1 + var3 + exp3), a >= 0, var3 >= 0, exp3 >= 0, x >= 0, e1 >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(0, subst[Ite](eqTerm(x, 1 + int3), x, a, 1 + int3)) :|: int3 >= 0, z' = a, a >= 0, z'' = 1 + e1 + (1 + int3), x >= 0, e1 >= 0, z = x subst(z, z', z'') -{ 2 }-> mkapp(0, mkapp(subst(x, a, e13), subst(x, a, e23))) :|: e13 >= 0, z' = a, z'' = 1 + e1 + (1 + e13 + e23), a >= 0, x >= 0, e1 >= 0, e23 >= 0, z = x subst(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 subst(z, z', z'') -{ 2 }-> 0 :|: t12'' >= 0, z' = a, z'' = 1 + int, z = 1 + t11'' + t12'', a >= 0, int >= 0, t11'' >= 0, 1 + int = v3, v0 >= 0, a = v2, v1 >= 0, 1 = v0, 1 + t11'' + t12'' = v1, v2 >= 0, v3 >= 0 subst(z, z', z'') -{ 2 }-> 0 :|: l1'' >= 0, z' = a, z'' = 1 + int, a >= 0, z = 1 + i1'' + l1'', i1'' >= 0, int >= 0, 1 + int = v3, v0 >= 0, a = v2, v1 >= 0, 1 = v0, 1 + i1'' + l1'' = v1, v2 >= 0, v3 >= 0 subst(z, z', z'') -{ 1 }-> 0 :|: z' = a, z'' = 1 + int, a >= 0, x >= 0, z = x, int >= 0, 1 + int = v3, v0 >= 0, a = v2, v1 >= 0, 0 = v0, x = v1, v2 >= 0, v3 >= 0 subst(z, z', z'') -{ 2 }-> 1 + e1' + e2' :|: z' = a, z'' = 1 + e1 + e2, a >= 0, x >= 0, e1 >= 0, z = x, e2 >= 0, 0 = e2', 0 = e1', e1' >= 0, e2' >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> a :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> e :|: z' = x, z1 = e, a >= 0, z = 1, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> e :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, subst[True][Ite](eqTerm(x, 1 + var5), x, a, 1 + var5 + exp5)) :|: z' = x, var >= 0, a >= 0, exp5 >= 0, z = 1, z'' = a, x >= 0, var5 >= 0, z1 = 1 + var + (1 + var5 + exp5) subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, subst[Ite](eqTerm(x, 1 + int7), x, a, 1 + int7)) :|: int7 >= 0, z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, z1 = 1 + var + (1 + int7) subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, mkapp(subst(x, a, e16), subst(x, a, e26))) :|: z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, e26 >= 0, e16 >= 0, z1 = 1 + var + (1 + e16 + e26) subst[True][Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, z1 = 1 + var + exp, exp >= 0, v0 >= 0, v1 >= 0, 1 + var = v0, 0 = v1 subst[True][Ite](z, z', z'', z1) -{ 1 }-> 1 + name + e :|: z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, z1 = 1 + var + exp, exp >= 0, 0 = e, 1 + var = 1 + name, e >= 0, name >= 0 ---------------------------------------- (29) SimplificationProof (BOTH BOUNDS(ID, ID)) Simplified the RNTS by moving equalities from the constraints into the right-hand sides. ---------------------------------------- (30) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z' - 1 >= 0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: z - 1 >= 0, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 !EQ(z, z') -{ 0 }-> !EQ(z - 1, z' - 1) :|: z - 1 >= 0, z' - 1 >= 0 and(z, z') -{ 0 }-> 2 :|: z = 2, z' = 2 and(z, z') -{ 0 }-> 1 :|: z = 1, z' = 1 and(z, z') -{ 0 }-> 1 :|: z = 2, z' = 1 and(z, z') -{ 0 }-> 1 :|: z' = 2, z = 1 and(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 appe1(z) -{ 1 }-> e1 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 appe2(z) -{ 1 }-> e2 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 eqTerm(z, z') -{ 1 }-> and(eqTerm(t11, t21), eqTerm(t12, t22)) :|: z' = 1 + t21 + t22, t11 >= 0, t21 >= 0, t12 >= 0, z = 1 + t11 + t12, t22 >= 0 eqTerm(z, z') -{ 1 }-> and(!EQ(i1, i2), eqTerm(l1, l2)) :|: i1 >= 0, z' = 1 + i2 + l2, l1 >= 0, i2 >= 0, l2 >= 0, z = 1 + i1 + l1 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + i2 + l2, t11 >= 0, t12 >= 0, i2 >= 0, l2 >= 0, z = 1 + t11 + t12 eqTerm(z, z') -{ 1 }-> 1 :|: t11 >= 0, t12 >= 0, z = 1 + t11 + t12, z' - 1 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + t21 + t22, t21 >= 0, l1 >= 0, z = 1 + i1 + l1, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, l1 >= 0, z = 1 + i1 + l1, z' - 1 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + t21 + t22, z - 1 >= 0, t21 >= 0, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + i2 + l2, z - 1 >= 0, i2 >= 0, l2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 eqTerm(z, z') -{ 1 }-> !EQ(z - 1, z' - 1) :|: z - 1 >= 0, z' - 1 >= 0 islam(z) -{ 1 }-> 2 :|: term >= 0, z = 1 + int + term, int >= 0 islam(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 islam(z) -{ 1 }-> 1 :|: z - 1 >= 0 isvar(z) -{ 1 }-> 2 :|: z - 1 >= 0 isvar(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 isvar(z) -{ 1 }-> 1 :|: term >= 0, z = 1 + int + term, int >= 0 lambdaint(z) -{ 1 }-> red(z) :|: z >= 0 lambody(z) -{ 1 }-> exp :|: var >= 0, z = 1 + var + exp, exp >= 0 lamvar(z) -{ 1 }-> 1 + var :|: var >= 0, z = 1 + var + exp, exp >= 0 mkapp(z, z') -{ 1 }-> 1 + z + z' :|: z >= 0, z' >= 0 mklam(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 mklam(z, z') -{ 1 }-> 1 + (z - 1) + z' :|: z' >= 0, z - 1 >= 0 red(z) -{ 1 }-> red[Let](1 + e1 + e2, 0) :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + int5) + e2, 1 + int5) :|: z = 1 + (1 + int5) + e2, int5 >= 0, e2 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + e14 + e24) + e2, red[Let](1 + e14 + e24, red(e14))) :|: e24 >= 0, z = 1 + (1 + e14 + e24) + e2, e2 >= 0, e14 >= 0 red(z) -{ 2 }-> red[Let](1 + (1 + int4 + term') + e2, 1 + int4 + term') :|: term' >= 0, int4 >= 0, z = 1 + (1 + int4 + term') + e2, e2 >= 0 red(z) -{ 0 }-> 0 :|: z >= 0 red(z) -{ 1 }-> 1 + (z - 1) :|: z - 1 >= 0 red(z) -{ 1 }-> 1 + int + term :|: term >= 0, z = 1 + int + term, int >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + e1 + e2, z', 0) :|: z' >= 0, e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + int9), z', 1 + int9) :|: z' >= 0, z = 1 + e1 + (1 + int9), int9 >= 0, e1 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + e17 + e27), z', red[Let](1 + e17 + e27, red(e17))) :|: z' >= 0, e17 >= 0, e27 >= 0, z = 1 + e1 + (1 + e17 + e27), e1 >= 0 red[Let](z, z') -{ 1 }-> red[Let][Let](1 + e1 + (1 + int8 + term''), z', 1 + int8 + term'') :|: z = 1 + e1 + (1 + int8 + term''), z' >= 0, term'' >= 0, e1 >= 0, int8 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 red[Let][Let](z, z', z'') -{ 1 }-> red(subst[True][Ite](eqTerm(1 + var, 1 + var4), 1 + var, z'', 1 + var4 + exp4)) :|: var >= 0, z'' >= 0, z' = 1 + var + (1 + var4 + exp4), var4 >= 0, exp4 >= 0, z >= 0 red[Let][Let](z, z', z'') -{ 1 }-> red(subst[Ite](eqTerm(1 + var, 1 + int6), 1 + var, z'', 1 + int6)) :|: var >= 0, int6 >= 0, z'' >= 0, z >= 0, z' = 1 + var + (1 + int6) red[Let][Let](z, z', z'') -{ 1 }-> red(mkapp(subst(1 + var, z'', e15), subst(1 + var, z'', e25))) :|: var >= 0, z'' >= 0, z' = 1 + var + (1 + e15 + e25), z >= 0, e25 >= 0, e15 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(0) :|: var >= 0, z'' >= 0, z' = 1 + var + exp, z >= 0, exp >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + (z' - 1)) + z'' :|: z >= 0, z' - 1 >= 0, z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + t1 + t2) + z'' :|: z' = 1 + t1 + t2, t1 >= 0, z >= 0, z'' >= 0, t2 >= 0 subst(z, z', z'') -{ 2 }-> e :|: t12'' >= 0, z = 1 + t11'' + t12'', z' >= 0, z'' - 1 >= 0, t11'' >= 0, 1 + t11'' + t12'' = x, 1 + (z'' - 1) = e, 1 = 1, x >= 0, e >= 0 subst(z, z', z'') -{ 2 }-> e :|: l1'' >= 0, z' >= 0, z = 1 + i1'' + l1'', i1'' >= 0, z'' - 1 >= 0, 1 + i1'' + l1'' = x, 1 + (z'' - 1) = e, 1 = 1, x >= 0, e >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](1, 1 + i1' + l1', z', 1 + var + exp) :|: i1' >= 0, z = 1 + i1' + l1', var >= 0, l1' >= 0, z' >= 0, z'' = 1 + var + exp, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](1, 1 + t11' + t12', z', 1 + var + exp) :|: t11' >= 0, var >= 0, z' >= 0, z'' = 1 + var + exp, z = 1 + t11' + t12', t12' >= 0, exp >= 0 subst(z, z', z'') -{ 1 }-> subst[True][Ite](0, z, z', 1 + var + exp) :|: var >= 0, z' >= 0, z'' = 1 + var + exp, z >= 0, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[True][Ite](!EQ(z - 1, var), 1 + (z - 1), z', 1 + var + exp) :|: var >= 0, z' >= 0, z'' = 1 + var + exp, z - 1 >= 0, exp >= 0 subst(z, z', z'') -{ 2 }-> subst[Ite](!EQ(z - 1, z'' - 1), 1 + (z - 1), z', 1 + (z'' - 1)) :|: z' >= 0, z - 1 >= 0, z'' - 1 >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + var'), z, z', 1 + var' + exp'), subst[True][Ite](eqTerm(z, 1 + var1), z, z', 1 + var1 + exp1)) :|: z'' = 1 + (1 + var' + exp') + (1 + var1 + exp1), exp' >= 0, z' >= 0, var1 >= 0, z >= 0, exp1 >= 0, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + var'), z, z', 1 + var' + exp'), subst[Ite](eqTerm(z, 1 + int1), z, z', 1 + int1)) :|: z'' = 1 + (1 + var' + exp') + (1 + int1), exp' >= 0, z' >= 0, z >= 0, int1 >= 0, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + var'), z, z', 1 + var' + exp'), mkapp(subst(z, z', e11), subst(z, z', e21))) :|: exp' >= 0, z' >= 0, e21 >= 0, z >= 0, e11 >= 0, z'' = 1 + (1 + var' + exp') + (1 + e11 + e21), var' >= 0 subst(z, z', z'') -{ 2 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + var'), z, z', 1 + var' + exp'), 0) :|: exp' >= 0, z' >= 0, z'' = 1 + (1 + var' + exp') + e2, z >= 0, e2 >= 0, var' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(z, 1 + int'), z, z', 1 + int'), subst[True][Ite](eqTerm(z, 1 + var2), z, z', 1 + var2 + exp2)) :|: int' >= 0, var2 >= 0, exp2 >= 0, z'' = 1 + (1 + int') + (1 + var2 + exp2), z' >= 0, z >= 0 subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(z, 1 + int'), z, z', 1 + int'), subst[Ite](eqTerm(z, 1 + int2), z, z', 1 + int2)) :|: int' >= 0, int2 >= 0, z' >= 0, z >= 0, z'' = 1 + (1 + int') + (1 + int2) subst(z, z', z'') -{ 3 }-> mkapp(subst[Ite](eqTerm(z, 1 + int'), z, z', 1 + int'), mkapp(subst(z, z', e12), subst(z, z', e22))) :|: int' >= 0, z' >= 0, z >= 0, e22 >= 0, z'' = 1 + (1 + int') + (1 + e12 + e22), e12 >= 0 subst(z, z', z'') -{ 2 }-> mkapp(subst[Ite](eqTerm(z, 1 + int'), z, z', 1 + int'), 0) :|: z'' = 1 + (1 + int') + e2, int' >= 0, z' >= 0, z >= 0, e2 >= 0 subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(z, z', e1'), subst(z, z', e2')), subst[True][Ite](eqTerm(z, 1 + var''), z, z', 1 + var'' + exp'')) :|: e1' >= 0, exp'' >= 0, z' >= 0, var'' >= 0, z >= 0, e2' >= 0, z'' = 1 + (1 + e1' + e2') + (1 + var'' + exp'') subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(z, z', e1'), subst(z, z', e2')), subst[Ite](eqTerm(z, 1 + int''), z, z', 1 + int'')) :|: e1' >= 0, z' >= 0, z >= 0, z'' = 1 + (1 + e1' + e2') + (1 + int''), int'' >= 0, e2' >= 0 subst(z, z', z'') -{ 3 }-> mkapp(mkapp(subst(z, z', e1'), subst(z, z', e2')), mkapp(subst(z, z', e1''), subst(z, z', e2''))) :|: e1' >= 0, z' >= 0, z >= 0, e1'' >= 0, z'' = 1 + (1 + e1' + e2') + (1 + e1'' + e2''), e2' >= 0, e2'' >= 0 subst(z, z', z'') -{ 2 }-> mkapp(mkapp(subst(z, z', e1'), subst(z, z', e2')), 0) :|: e1' >= 0, z' >= 0, z >= 0, z'' = 1 + (1 + e1' + e2') + e2, e2' >= 0, e2 >= 0 subst(z, z', z'') -{ 2 }-> mkapp(0, subst[True][Ite](eqTerm(z, 1 + var3), z, z', 1 + var3 + exp3)) :|: z'' = 1 + e1 + (1 + var3 + exp3), z' >= 0, var3 >= 0, exp3 >= 0, z >= 0, e1 >= 0 subst(z, z', z'') -{ 2 }-> mkapp(0, subst[Ite](eqTerm(z, 1 + int3), z, z', 1 + int3)) :|: int3 >= 0, z' >= 0, z'' = 1 + e1 + (1 + int3), z >= 0, e1 >= 0 subst(z, z', z'') -{ 2 }-> mkapp(0, mkapp(subst(z, z', e13), subst(z, z', e23))) :|: e13 >= 0, z'' = 1 + e1 + (1 + e13 + e23), z' >= 0, z >= 0, e1 >= 0, e23 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0 subst(z, z', z'') -{ 2 }-> 0 :|: t12'' >= 0, z = 1 + t11'' + t12'', z' >= 0, z'' - 1 >= 0, t11'' >= 0, 1 + (z'' - 1) = v3, v0 >= 0, v1 >= 0, 1 = v0, 1 + t11'' + t12'' = v1, v3 >= 0 subst(z, z', z'') -{ 2 }-> 0 :|: l1'' >= 0, z' >= 0, z = 1 + i1'' + l1'', i1'' >= 0, z'' - 1 >= 0, 1 + (z'' - 1) = v3, v0 >= 0, v1 >= 0, 1 = v0, 1 + i1'' + l1'' = v1, v3 >= 0 subst(z, z', z'') -{ 1 }-> 0 :|: z' >= 0, z >= 0, z'' - 1 >= 0, 1 + (z'' - 1) = v3, v0 >= 0, 0 = v0, v3 >= 0 subst(z, z', z'') -{ 2 }-> 1 + e1' + e2' :|: z'' = 1 + e1 + e2, z' >= 0, z >= 0, e1 >= 0, e2 >= 0, 0 = e2', 0 = e1', e1' >= 0, e2' >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> z'' :|: z = 2, z'' >= 0, z' >= 0, z1 >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> z1 :|: z'' >= 0, z = 1, z' >= 0, z1 >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0, z1 >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> z1 :|: z = 2, z'' >= 0, z' >= 0, z1 >= 0 subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, subst[True][Ite](eqTerm(z', 1 + var5), z', z'', 1 + var5 + exp5)) :|: var >= 0, z'' >= 0, exp5 >= 0, z = 1, z' >= 0, var5 >= 0, z1 = 1 + var + (1 + var5 + exp5) subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, subst[Ite](eqTerm(z', 1 + int7), z', z'', 1 + int7)) :|: int7 >= 0, var >= 0, z'' >= 0, z = 1, z' >= 0, z1 = 1 + var + (1 + int7) subst[True][Ite](z, z', z'', z1) -{ 1 }-> mklam(1 + var, mkapp(subst(z', z'', e16), subst(z', z'', e26))) :|: var >= 0, z'' >= 0, z = 1, z' >= 0, e26 >= 0, e16 >= 0, z1 = 1 + var + (1 + e16 + e26) subst[True][Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0, z1 >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> 0 :|: var >= 0, z'' >= 0, z = 1, z' >= 0, z1 = 1 + var + exp, exp >= 0, v0 >= 0, v1 >= 0, 1 + var = v0, 0 = v1 subst[True][Ite](z, z', z'', z1) -{ 1 }-> 1 + name + e :|: var >= 0, z'' >= 0, z = 1, z' >= 0, z1 = 1 + var + exp, exp >= 0, 0 = e, 1 + var = 1 + name, e >= 0, name >= 0 ---------------------------------------- (31) CompletionProof (UPPER BOUND(ID)) The TRS is a completely defined constructor system, as every type has a constant constructor and the following rules were added: and(v0, v1) -> null_and [0] !EQ(v0, v1) -> null_!EQ [0] red[Let][Let](v0, v1, v2) -> null_red[Let][Let] [0] subst[True][Ite](v0, v1, v2, v3) -> null_subst[True][Ite] [0] red[Let](v0, v1) -> null_red[Let] [0] subst[Ite](v0, v1, v2, v3) -> null_subst[Ite] [0] subst(v0, v1, v2) -> null_subst [0] red(v0) -> null_red [0] eqTerm(v0, v1) -> null_eqTerm [0] mklam(v0, v1) -> null_mklam [0] lamvar(v0) -> null_lamvar [0] lambody(v0) -> null_lambody [0] isvar(v0) -> null_isvar [0] islam(v0) -> null_islam [0] appe2(v0) -> null_appe2 [0] appe1(v0) -> null_appe1 [0] And the following fresh constants: null_and, null_!EQ, null_red[Let][Let], null_subst[True][Ite], null_red[Let], null_subst[Ite], null_subst, null_red, null_eqTerm, null_mklam, null_lamvar, null_lambody, null_isvar, null_islam, null_appe2, null_appe1 ---------------------------------------- (32) Obligation: Runtime Complexity Weighted TRS where all functions are completely defined. The underlying TRS is: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: subst(x, a, App(e1, e2)) -> mkapp(subst(x, a, e1), subst(x, a, e2)) [1] subst(x, a, Lam(var, exp)) -> subst[True][Ite](eqTerm(x, V(var)), x, a, Lam(var, exp)) [1] red(App(e1, e2)) -> red[Let](App(e1, e2), red(e1)) [1] red(Lam(int, term)) -> Lam(int, term) [1] subst(x, a, V(int)) -> subst[Ite](eqTerm(x, V(int)), x, a, V(int)) [1] red(V(int)) -> V(int) [1] eqTerm(App(t11, t12), App(t21, t22)) -> and(eqTerm(t11, t21), eqTerm(t12, t22)) [1] eqTerm(App(t11, t12), Lam(i2, l2)) -> False [1] eqTerm(App(t11, t12), V(v2)) -> False [1] eqTerm(Lam(i1, l1), App(t21, t22)) -> False [1] eqTerm(Lam(i1, l1), Lam(i2, l2)) -> and(!EQ(i1, i2), eqTerm(l1, l2)) [1] eqTerm(Lam(i1, l1), V(v2)) -> False [1] eqTerm(V(v1), App(t21, t22)) -> False [1] eqTerm(V(v1), Lam(i2, l2)) -> False [1] eqTerm(V(v1), V(v2)) -> !EQ(v1, v2) [1] mklam(V(name), e) -> Lam(name, e) [1] lamvar(Lam(var, exp)) -> V(var) [1] lambody(Lam(var, exp)) -> exp [1] isvar(App(t1, t2)) -> False [1] isvar(Lam(int, term)) -> False [1] isvar(V(int)) -> True [1] islam(App(t1, t2)) -> False [1] islam(Lam(int, term)) -> True [1] islam(V(int)) -> False [1] appe2(App(e1, e2)) -> e2 [1] appe1(App(e1, e2)) -> e1 [1] mkapp(e1, e2) -> App(e1, e2) [1] lambdaint(e) -> red(e) [1] and(False, False) -> False [0] and(True, False) -> False [0] and(False, True) -> False [0] and(True, True) -> True [0] !EQ(S(x), S(y)) -> !EQ(x, y) [0] !EQ(0, S(y)) -> False [0] !EQ(S(x), 0) -> False [0] !EQ(0, 0) -> True [0] red[Let][Let](e, Lam(var, exp), a) -> red(subst(V(var), a, exp)) [0] subst[True][Ite](False, x, a, Lam(var, exp)) -> mklam(V(var), subst(x, a, exp)) [0] red[Let][Let](e, App(t1, t2), e2) -> App(App(t1, t2), e2) [0] red[Let][Let](e, V(int), e2) -> App(V(int), e2) [0] red[Let](App(e1, e2), f) -> red[Let][Let](App(e1, e2), f, red(e2)) [0] subst[True][Ite](True, x, a, e) -> e [0] subst[Ite](False, x, a, e) -> e [0] subst[Ite](True, x, a, e) -> a [0] and(v0, v1) -> null_and [0] !EQ(v0, v1) -> null_!EQ [0] red[Let][Let](v0, v1, v2) -> null_red[Let][Let] [0] subst[True][Ite](v0, v1, v2, v3) -> null_subst[True][Ite] [0] red[Let](v0, v1) -> null_red[Let] [0] subst[Ite](v0, v1, v2, v3) -> null_subst[Ite] [0] subst(v0, v1, v2) -> null_subst [0] red(v0) -> null_red [0] eqTerm(v0, v1) -> null_eqTerm [0] mklam(v0, v1) -> null_mklam [0] lamvar(v0) -> null_lamvar [0] lambody(v0) -> null_lambody [0] isvar(v0) -> null_isvar [0] islam(v0) -> null_islam [0] appe2(v0) -> null_appe2 [0] appe1(v0) -> null_appe1 [0] The TRS has the following type information: subst :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 App :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 mkapp :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 Lam :: S:0 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 subst[True][Ite] :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 eqTerm :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam V :: S:0 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 red :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 red[Let] :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 subst[Ite] :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 and :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam -> False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam -> False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam False :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam !EQ :: S:0 -> S:0 -> False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam mklam :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 lamvar :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 lambody :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 isvar :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam True :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam islam :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam appe2 :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 appe1 :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 lambdaint :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 S :: S:0 -> S:0 0 :: S:0 red[Let][Let] :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 -> App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_and :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam null_!EQ :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam null_red[Let][Let] :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_subst[True][Ite] :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_red[Let] :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_subst[Ite] :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_subst :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_red :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_eqTerm :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam null_mklam :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_lamvar :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_lambody :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_isvar :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam null_islam :: False:True:null_and:null_!EQ:null_eqTerm:null_isvar:null_islam null_appe2 :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 null_appe1 :: App:Lam:V:null_red[Let][Let]:null_subst[True][Ite]:null_red[Let]:null_subst[Ite]:null_subst:null_red:null_mklam:null_lamvar:null_lambody:null_appe2:null_appe1 Rewrite Strategy: INNERMOST ---------------------------------------- (33) CpxTypedWeightedTrsToRntsProof (UPPER BOUND(ID)) Transformed the TRS into an over-approximating RNTS by (improved) Size Abstraction. The constant constructors are abstracted as follows: False => 1 True => 2 0 => 0 null_and => 0 null_!EQ => 0 null_red[Let][Let] => 0 null_subst[True][Ite] => 0 null_red[Let] => 0 null_subst[Ite] => 0 null_subst => 0 null_red => 0 null_eqTerm => 0 null_mklam => 0 null_lamvar => 0 null_lambody => 0 null_isvar => 0 null_islam => 0 null_appe2 => 0 null_appe1 => 0 ---------------------------------------- (34) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z' = 1 + y, y >= 0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: x >= 0, z = 1 + x, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ(z, z') -{ 0 }-> !EQ(x, y) :|: z' = 1 + y, x >= 0, y >= 0, z = 1 + x and(z, z') -{ 0 }-> 2 :|: z = 2, z' = 2 and(z, z') -{ 0 }-> 1 :|: z = 1, z' = 1 and(z, z') -{ 0 }-> 1 :|: z = 2, z' = 1 and(z, z') -{ 0 }-> 1 :|: z' = 2, z = 1 and(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 appe1(z) -{ 1 }-> e1 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 appe1(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 appe2(z) -{ 1 }-> e2 :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 appe2(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 eqTerm(z, z') -{ 1 }-> and(eqTerm(t11, t21), eqTerm(t12, t22)) :|: z' = 1 + t21 + t22, t11 >= 0, t21 >= 0, t12 >= 0, z = 1 + t11 + t12, t22 >= 0 eqTerm(z, z') -{ 1 }-> and(!EQ(i1, i2), eqTerm(l1, l2)) :|: i1 >= 0, z' = 1 + i2 + l2, l1 >= 0, i2 >= 0, l2 >= 0, z = 1 + i1 + l1 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + i2 + l2, t11 >= 0, t12 >= 0, i2 >= 0, l2 >= 0, z = 1 + t11 + t12 eqTerm(z, z') -{ 1 }-> 1 :|: z' = 1 + v2, t11 >= 0, t12 >= 0, z = 1 + t11 + t12, v2 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + t21 + t22, t21 >= 0, l1 >= 0, z = 1 + i1 + l1, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: i1 >= 0, z' = 1 + v2, l1 >= 0, z = 1 + i1 + l1, v2 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z = 1 + v1, z' = 1 + t21 + t22, v1 >= 0, t21 >= 0, t22 >= 0 eqTerm(z, z') -{ 1 }-> 1 :|: z = 1 + v1, z' = 1 + i2 + l2, v1 >= 0, i2 >= 0, l2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 eqTerm(z, z') -{ 1 }-> !EQ(v1, v2) :|: z' = 1 + v2, z = 1 + v1, v1 >= 0, v2 >= 0 islam(z) -{ 1 }-> 2 :|: term >= 0, z = 1 + int + term, int >= 0 islam(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 islam(z) -{ 1 }-> 1 :|: int >= 0, z = 1 + int islam(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 isvar(z) -{ 1 }-> 2 :|: int >= 0, z = 1 + int isvar(z) -{ 1 }-> 1 :|: z = 1 + t1 + t2, t1 >= 0, t2 >= 0 isvar(z) -{ 1 }-> 1 :|: term >= 0, z = 1 + int + term, int >= 0 isvar(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 lambdaint(z) -{ 1 }-> red(e) :|: z = e, e >= 0 lambody(z) -{ 1 }-> exp :|: var >= 0, z = 1 + var + exp, exp >= 0 lambody(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 lamvar(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 lamvar(z) -{ 1 }-> 1 + var :|: var >= 0, z = 1 + var + exp, exp >= 0 mkapp(z, z') -{ 1 }-> 1 + e1 + e2 :|: z' = e2, z = e1, e1 >= 0, e2 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 1 }-> 1 + name + e :|: z' = e, z = 1 + name, e >= 0, name >= 0 red(z) -{ 1 }-> red[Let](1 + e1 + e2, red(e1)) :|: e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 red(z) -{ 1 }-> 1 + int :|: int >= 0, z = 1 + int red(z) -{ 1 }-> 1 + int + term :|: term >= 0, z = 1 + int + term, int >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + e1 + e2, f, red(e2)) :|: f >= 0, z' = f, e1 >= 0, z = 1 + e1 + e2, e2 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 red[Let][Let](z, z', z'') -{ 0 }-> red(subst(1 + var, a, exp)) :|: z = e, var >= 0, a >= 0, z'' = a, z' = 1 + var + exp, e >= 0, exp >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + int) + e2 :|: z = e, e >= 0, int >= 0, e2 >= 0, z' = 1 + int, z'' = e2 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + t1 + t2) + e2 :|: z = e, z' = 1 + t1 + t2, t1 >= 0, e >= 0, e2 >= 0, t2 >= 0, z'' = e2 subst(z, z', z'') -{ 1 }-> subst[True][Ite](eqTerm(x, 1 + var), x, a, 1 + var + exp) :|: z' = a, var >= 0, a >= 0, z'' = 1 + var + exp, x >= 0, z = x, exp >= 0 subst(z, z', z'') -{ 1 }-> subst[Ite](eqTerm(x, 1 + int), x, a, 1 + int) :|: z' = a, z'' = 1 + int, a >= 0, x >= 0, z = x, int >= 0 subst(z, z', z'') -{ 1 }-> mkapp(subst(x, a, e1), subst(x, a, e2)) :|: z' = a, z'' = 1 + e1 + e2, a >= 0, x >= 0, e1 >= 0, z = x, e2 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> a :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> e :|: z' = x, z1 = e, a >= 0, z = 1, z'' = a, x >= 0, e >= 0 subst[Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> e :|: z = 2, z' = x, z1 = e, a >= 0, z'' = a, x >= 0, e >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> mklam(1 + var, subst(x, a, exp)) :|: z' = x, var >= 0, a >= 0, z = 1, z'' = a, x >= 0, z1 = 1 + var + exp, exp >= 0 subst[True][Ite](z, z', z'', z1) -{ 0 }-> 0 :|: z1 = v3, v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0, v3 >= 0 Only complete derivations are relevant for the runtime complexity. ---------------------------------------- (35) CpxTrsToCdtProof (UPPER BOUND(ID)) Converted Cpx (relative) TRS with rewrite strategy PARALLEL_INNERMOST to CDT ---------------------------------------- (36) Obligation: Complexity Dependency Tuples Problem Rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Tuples: AND(False, False) -> c AND(True, False) -> c1 AND(False, True) -> c2 AND(True, True) -> c3 !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) !EQ'(0, S(z0)) -> c5 !EQ'(S(z0), 0) -> c6 !EQ'(0, 0) -> c7 RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) RED[LET][LET](z0, App(z1, z2), z3) -> c9 RED[LET][LET](z0, V(z1), z2) -> c10 SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST[ITE](False, z0, z1, z2) -> c14 SUBST[ITE](True, z0, z1, z2) -> c15 SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) S tuples: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 EQTERM(App(z0, z1), V(z2)) -> c26 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 EQTERM(V(z0), Lam(z1, z2)) -> c32 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 LAMVAR(Lam(z0, z1)) -> c35 LAMBODY(Lam(z0, z1)) -> c36 ISVAR(App(z0, z1)) -> c37 ISVAR(Lam(z0, z1)) -> c38 ISVAR(V(z0)) -> c39 ISLAM(App(z0, z1)) -> c40 ISLAM(Lam(z0, z1)) -> c41 ISLAM(V(z0)) -> c42 APPE2(App(z0, z1)) -> c43 APPE1(App(z0, z1)) -> c44 MKAPP(z0, z1) -> c45 LAMBDAINT(z0) -> c46(RED(z0)) K tuples:none Defined Rule Symbols: subst_3, red_1, eqTerm_2, mklam_2, lamvar_1, lambody_1, isvar_1, islam_1, appe2_1, appe1_1, mkapp_2, lambdaint_1, and_2, !EQ_2, red[Let][Let]_3, subst[True][Ite]_4, red[Let]_2, subst[Ite]_4 Defined Pair Symbols: AND_2, !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST[ITE]_4, SUBST_3, RED_1, EQTERM_2, MKLAM_2, LAMVAR_1, LAMBODY_1, ISVAR_1, ISLAM_1, APPE2_1, APPE1_1, MKAPP_2, LAMBDAINT_1 Compound Symbols: c, c1, c2, c3, c4_1, c5, c6, c7, c8_2, c9, c10, c11_2, c12, c13_2, c14, c15, c16_2, c17_2, c18_2, c19_2, c20_2, c21, c22, c23_2, c24_2, c25, c26, c27, c28_2, c29_2, c30, c31, c32, c33_1, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44, c45, c46_1 ---------------------------------------- (37) CdtLeafRemovalProof (ComplexityIfPolyImplication) Removed 1 leading nodes: LAMBDAINT(z0) -> c46(RED(z0)) Removed 29 trailing nodes: ISLAM(App(z0, z1)) -> c40 ISLAM(V(z0)) -> c42 LAMVAR(Lam(z0, z1)) -> c35 AND(False, True) -> c2 EQTERM(Lam(z0, z1), V(z2)) -> c30 EQTERM(V(z0), App(z1, z2)) -> c31 AND(False, False) -> c RED[LET][LET](z0, V(z1), z2) -> c10 RED[LET][LET](z0, App(z1, z2), z3) -> c9 AND(True, True) -> c3 EQTERM(App(z0, z1), Lam(z2, z3)) -> c25 ISLAM(Lam(z0, z1)) -> c41 EQTERM(Lam(z0, z1), App(z2, z3)) -> c27 SUBST[ITE](False, z0, z1, z2) -> c14 AND(True, False) -> c1 EQTERM(App(z0, z1), V(z2)) -> c26 !EQ'(S(z0), 0) -> c6 ISVAR(V(z0)) -> c39 EQTERM(V(z0), Lam(z1, z2)) -> c32 SUBST[TRUE][ITE](True, z0, z1, z2) -> c12 APPE1(App(z0, z1)) -> c44 ISVAR(Lam(z0, z1)) -> c38 LAMBODY(Lam(z0, z1)) -> c36 APPE2(App(z0, z1)) -> c43 SUBST[ITE](True, z0, z1, z2) -> c15 !EQ'(0, 0) -> c7 !EQ'(0, S(z0)) -> c5 MKAPP(z0, z1) -> c45 ISVAR(App(z0, z1)) -> c37 ---------------------------------------- (38) Obligation: Complexity Dependency Tuples Problem Rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 S tuples: SUBST(z0, z1, App(z2, z3)) -> c16(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(MKAPP(subst(z0, z1, z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) SUBST(z0, z1, V(z2)) -> c19(SUBST[ITE](eqTerm(z0, V(z2)), z0, z1, V(z2)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(App(z0, z1), App(z2, z3)) -> c23(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(AND(eqTerm(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(AND(!EQ(z0, z2), eqTerm(z1, z3)), !EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(AND(!EQ(z0, z2), eqTerm(z1, z3)), EQTERM(z1, z3)) EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 K tuples:none Defined Rule Symbols: subst_3, red_1, eqTerm_2, mklam_2, lamvar_1, lambody_1, isvar_1, islam_1, appe2_1, appe1_1, mkapp_2, lambdaint_1, and_2, !EQ_2, red[Let][Let]_3, subst[True][Ite]_4, red[Let]_2, subst[Ite]_4 Defined Pair Symbols: !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST_3, RED_1, EQTERM_2, MKLAM_2 Compound Symbols: c4_1, c8_2, c11_2, c13_2, c16_2, c17_2, c18_2, c19_2, c20_2, c21, c22, c23_2, c24_2, c28_2, c29_2, c33_1, c34 ---------------------------------------- (39) CdtRhsSimplificationProcessorProof (BOTH BOUNDS(ID, ID)) Removed 7 trailing tuple parts ---------------------------------------- (40) Obligation: Complexity Dependency Tuples Problem Rules: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) mklam(V(z0), z1) -> Lam(z0, z1) lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 mkapp(z0, z1) -> App(z0, z1) lambdaint(z0) -> red(z0) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) S tuples: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) K tuples:none Defined Rule Symbols: subst_3, red_1, eqTerm_2, mklam_2, lamvar_1, lambody_1, isvar_1, islam_1, appe2_1, appe1_1, mkapp_2, lambdaint_1, and_2, !EQ_2, red[Let][Let]_3, subst[True][Ite]_4, red[Let]_2, subst[Ite]_4 Defined Pair Symbols: !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST_3, RED_1, EQTERM_2, MKLAM_2 Compound Symbols: c4_1, c8_2, c11_2, c13_2, c18_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (41) CdtUsableRulesProof (BOTH BOUNDS(ID, ID)) The following rules are not usable and were removed: and(False, False) -> False and(True, False) -> False and(False, True) -> False and(True, True) -> True eqTerm(App(z0, z1), App(z2, z3)) -> and(eqTerm(z0, z2), eqTerm(z1, z3)) eqTerm(App(z0, z1), Lam(z2, z3)) -> False eqTerm(Lam(z0, z1), App(z2, z3)) -> False eqTerm(Lam(z0, z1), Lam(z2, z3)) -> and(!EQ(z0, z2), eqTerm(z1, z3)) eqTerm(V(z0), App(z1, z2)) -> False eqTerm(V(z0), Lam(z1, z2)) -> False lamvar(Lam(z0, z1)) -> V(z0) lambody(Lam(z0, z1)) -> z1 isvar(App(z0, z1)) -> False isvar(Lam(z0, z1)) -> False isvar(V(z0)) -> True islam(App(z0, z1)) -> False islam(Lam(z0, z1)) -> True islam(V(z0)) -> False appe2(App(z0, z1)) -> z1 appe1(App(z0, z1)) -> z0 lambdaint(z0) -> red(z0) ---------------------------------------- (42) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) S tuples: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) K tuples:none Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST_3, RED_1, EQTERM_2, MKLAM_2 Compound Symbols: c4_1, c8_2, c11_2, c13_2, c18_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (43) CdtToCpxRelTrsProof (BOTH BOUNDS(ID, ID)) Converted S to standard rules, and D \ S as well as R to relative rules. ---------------------------------------- (44) Obligation: The Runtime Complexity (innermost) of the given CpxRelTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) The (relative) TRS S consists of the following rules: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Rewrite Strategy: INNERMOST ---------------------------------------- (45) RelTrsToTrsProof (UPPER BOUND(ID)) transformed relative TRS to TRS ---------------------------------------- (46) Obligation: The Runtime Complexity (innermost) of the given CpxTRS could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) S is empty. Rewrite Strategy: INNERMOST ---------------------------------------- (47) RelTrsToWeightedTrsProof (BOTH BOUNDS(ID, ID)) Transformed relative TRS to weighted TRS ---------------------------------------- (48) Obligation: The Runtime Complexity (innermost) of the given CpxWeightedTrs could be proven to be BOUNDS(1, INF). The TRS R consists of the following rules: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) [1] RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) [1] RED(Lam(z0, z1)) -> c21 [1] RED(V(z0)) -> c22 [1] EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) [1] MKLAM(V(z0), z1) -> c34 [1] SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) [1] SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) [1] SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) [1] !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) [0] RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) [0] RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) [0] subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) [0] subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) [0] subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) [0] mkapp(z0, z1) -> App(z0, z1) [0] subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) [0] subst[True][Ite](True, z0, z1, z2) -> z2 [0] eqTerm(App(z0, z1), V(z2)) -> False [0] eqTerm(Lam(z0, z1), V(z2)) -> False [0] eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) [0] !EQ(S(z0), S(z1)) -> !EQ(z0, z1) [0] !EQ(0, S(z0)) -> False [0] !EQ(S(z0), 0) -> False [0] !EQ(0, 0) -> True [0] mklam(V(z0), z1) -> Lam(z0, z1) [0] subst[Ite](False, z0, z1, z2) -> z2 [0] subst[Ite](True, z0, z1, z2) -> z1 [0] red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) [0] red(Lam(z0, z1)) -> Lam(z0, z1) [0] red(V(z0)) -> V(z0) [0] red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) [0] red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) [0] red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) [0] red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) [0] Rewrite Strategy: INNERMOST ---------------------------------------- (49) TypeInferenceProof (BOTH BOUNDS(ID, ID)) Infered types. ---------------------------------------- (50) Obligation: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) [1] RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) [1] RED(Lam(z0, z1)) -> c21 [1] RED(V(z0)) -> c22 [1] EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) [1] MKLAM(V(z0), z1) -> c34 [1] SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) [1] SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) [1] SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) [1] !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) [0] RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) [0] RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) [0] subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) [0] subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) [0] subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) [0] mkapp(z0, z1) -> App(z0, z1) [0] subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) [0] subst[True][Ite](True, z0, z1, z2) -> z2 [0] eqTerm(App(z0, z1), V(z2)) -> False [0] eqTerm(Lam(z0, z1), V(z2)) -> False [0] eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) [0] !EQ(S(z0), S(z1)) -> !EQ(z0, z1) [0] !EQ(0, S(z0)) -> False [0] !EQ(S(z0), 0) -> False [0] !EQ(0, 0) -> True [0] mklam(V(z0), z1) -> Lam(z0, z1) [0] subst[Ite](False, z0, z1, z2) -> z2 [0] subst[Ite](True, z0, z1, z2) -> z1 [0] red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) [0] red(Lam(z0, z1)) -> Lam(z0, z1) [0] red(V(z0)) -> V(z0) [0] red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) [0] red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) [0] red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) [0] red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) [0] The TRS has the following type information: SUBST :: Lam:V:App -> Lam:V:App -> Lam:V:App -> c18:c16:c17:c19 Lam :: S:0 -> Lam:V:App -> Lam:V:App c18 :: c11 -> c33:c23:c24:c28:c29 -> c18:c16:c17:c19 SUBST[TRUE][ITE] :: False:True -> Lam:V:App -> Lam:V:App -> Lam:V:App -> c11 eqTerm :: Lam:V:App -> Lam:V:App -> False:True V :: S:0 -> Lam:V:App EQTERM :: Lam:V:App -> Lam:V:App -> c33:c23:c24:c28:c29 RED :: Lam:V:App -> c20:c21:c22 App :: Lam:V:App -> Lam:V:App -> Lam:V:App c20 :: c13 -> c20:c21:c22 -> c20:c21:c22 RED[LET] :: Lam:V:App -> Lam:V:App -> c13 red :: Lam:V:App -> Lam:V:App c21 :: c20:c21:c22 c22 :: c20:c21:c22 c33 :: c4 -> c33:c23:c24:c28:c29 !EQ' :: S:0 -> S:0 -> c4 MKLAM :: Lam:V:App -> Lam:V:App -> c34 c34 :: c34 c16 :: c18:c16:c17:c19 -> c18:c16:c17:c19 c17 :: c18:c16:c17:c19 -> c18:c16:c17:c19 c19 :: c33:c23:c24:c28:c29 -> c18:c16:c17:c19 c23 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 c24 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 c28 :: c4 -> c33:c23:c24:c28:c29 c29 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 S :: S:0 -> S:0 c4 :: c4 -> c4 RED[LET][LET] :: Lam:V:App -> Lam:V:App -> Lam:V:App -> c8 c8 :: c20:c21:c22 -> c18:c16:c17:c19 -> c8 subst :: Lam:V:App -> Lam:V:App -> Lam:V:App -> Lam:V:App False :: False:True c11 :: c34 -> c18:c16:c17:c19 -> c11 c13 :: c8 -> c20:c21:c22 -> c13 mkapp :: Lam:V:App -> Lam:V:App -> Lam:V:App subst[True][Ite] :: False:True -> Lam:V:App -> Lam:V:App -> Lam:V:App -> Lam:V:App subst[Ite] :: False:True -> Lam:V:App -> Lam:V:App -> Lam:V:App -> Lam:V:App mklam :: Lam:V:App -> Lam:V:App -> Lam:V:App True :: False:True !EQ :: S:0 -> S:0 -> False:True 0 :: S:0 red[Let] :: Lam:V:App -> Lam:V:App -> Lam:V:App red[Let][Let] :: Lam:V:App -> Lam:V:App -> Lam:V:App -> Lam:V:App Rewrite Strategy: INNERMOST ---------------------------------------- (51) CompletionProof (UPPER BOUND(ID)) The transformation into a RNTS is sound, since: (a) The obligation is a constructor system where every type has a constant constructor, (b) The following defined symbols do not have to be completely defined, as they can never occur inside other defined symbols: SUBST_3 RED_1 EQTERM_2 MKLAM_2 (c) The following functions are completely defined: !EQ'_2 RED[LET][LET]_3 SUBST[TRUE][ITE]_4 RED[LET]_2 subst_3 mkapp_2 subst[True][Ite]_4 eqTerm_2 !EQ_2 mklam_2 subst[Ite]_4 red_1 red[Let]_2 red[Let][Let]_3 Due to the following rules being added: !EQ'(v0, v1) -> const5 [0] RED[LET][LET](v0, v1, v2) -> const6 [0] SUBST[TRUE][ITE](v0, v1, v2, v3) -> const2 [0] RED[LET](v0, v1) -> const4 [0] subst(v0, v1, v2) -> const1 [0] mkapp(v0, v1) -> const1 [0] subst[True][Ite](v0, v1, v2, v3) -> const1 [0] eqTerm(v0, v1) -> null_eqTerm [0] !EQ(v0, v1) -> null_!EQ [0] mklam(v0, v1) -> const1 [0] subst[Ite](v0, v1, v2, v3) -> const1 [0] red(v0) -> const1 [0] red[Let](v0, v1) -> const1 [0] red[Let][Let](v0, v1, v2) -> const1 [0] And the following fresh constants: const5, const6, const2, const4, const1, null_eqTerm, null_!EQ, const, const3 ---------------------------------------- (52) Obligation: Runtime Complexity Weighted TRS where critical functions are completely defined. The underlying TRS is: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) [1] RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) [1] RED(Lam(z0, z1)) -> c21 [1] RED(V(z0)) -> c22 [1] EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) [1] MKLAM(V(z0), z1) -> c34 [1] SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) [1] SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) [1] SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) [1] !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) [0] RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) [0] RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) [0] subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) [0] subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) [0] subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) [0] mkapp(z0, z1) -> App(z0, z1) [0] subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) [0] subst[True][Ite](True, z0, z1, z2) -> z2 [0] eqTerm(App(z0, z1), V(z2)) -> False [0] eqTerm(Lam(z0, z1), V(z2)) -> False [0] eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) [0] !EQ(S(z0), S(z1)) -> !EQ(z0, z1) [0] !EQ(0, S(z0)) -> False [0] !EQ(S(z0), 0) -> False [0] !EQ(0, 0) -> True [0] mklam(V(z0), z1) -> Lam(z0, z1) [0] subst[Ite](False, z0, z1, z2) -> z2 [0] subst[Ite](True, z0, z1, z2) -> z1 [0] red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) [0] red(Lam(z0, z1)) -> Lam(z0, z1) [0] red(V(z0)) -> V(z0) [0] red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) [0] red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) [0] red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) [0] red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) [0] !EQ'(v0, v1) -> const5 [0] RED[LET][LET](v0, v1, v2) -> const6 [0] SUBST[TRUE][ITE](v0, v1, v2, v3) -> const2 [0] RED[LET](v0, v1) -> const4 [0] subst(v0, v1, v2) -> const1 [0] mkapp(v0, v1) -> const1 [0] subst[True][Ite](v0, v1, v2, v3) -> const1 [0] eqTerm(v0, v1) -> null_eqTerm [0] !EQ(v0, v1) -> null_!EQ [0] mklam(v0, v1) -> const1 [0] subst[Ite](v0, v1, v2, v3) -> const1 [0] red(v0) -> const1 [0] red[Let](v0, v1) -> const1 [0] red[Let][Let](v0, v1, v2) -> const1 [0] The TRS has the following type information: SUBST :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> c18:c16:c17:c19 Lam :: S:0 -> Lam:V:App:const1 -> Lam:V:App:const1 c18 :: c11:const2 -> c33:c23:c24:c28:c29 -> c18:c16:c17:c19 SUBST[TRUE][ITE] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> c11:const2 eqTerm :: Lam:V:App:const1 -> Lam:V:App:const1 -> False:True:null_eqTerm:null_!EQ V :: S:0 -> Lam:V:App:const1 EQTERM :: Lam:V:App:const1 -> Lam:V:App:const1 -> c33:c23:c24:c28:c29 RED :: Lam:V:App:const1 -> c20:c21:c22 App :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 c20 :: c13:const4 -> c20:c21:c22 -> c20:c21:c22 RED[LET] :: Lam:V:App:const1 -> Lam:V:App:const1 -> c13:const4 red :: Lam:V:App:const1 -> Lam:V:App:const1 c21 :: c20:c21:c22 c22 :: c20:c21:c22 c33 :: c4:const5 -> c33:c23:c24:c28:c29 !EQ' :: S:0 -> S:0 -> c4:const5 MKLAM :: Lam:V:App:const1 -> Lam:V:App:const1 -> c34 c34 :: c34 c16 :: c18:c16:c17:c19 -> c18:c16:c17:c19 c17 :: c18:c16:c17:c19 -> c18:c16:c17:c19 c19 :: c33:c23:c24:c28:c29 -> c18:c16:c17:c19 c23 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 c24 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 c28 :: c4:const5 -> c33:c23:c24:c28:c29 c29 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 S :: S:0 -> S:0 c4 :: c4:const5 -> c4:const5 RED[LET][LET] :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> c8:const6 c8 :: c20:c21:c22 -> c18:c16:c17:c19 -> c8:const6 subst :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 False :: False:True:null_eqTerm:null_!EQ c11 :: c34 -> c18:c16:c17:c19 -> c11:const2 c13 :: c8:const6 -> c20:c21:c22 -> c13:const4 mkapp :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 subst[True][Ite] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 subst[Ite] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 mklam :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 True :: False:True:null_eqTerm:null_!EQ !EQ :: S:0 -> S:0 -> False:True:null_eqTerm:null_!EQ 0 :: S:0 red[Let] :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 red[Let][Let] :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 const5 :: c4:const5 const6 :: c8:const6 const2 :: c11:const2 const4 :: c13:const4 const1 :: Lam:V:App:const1 null_eqTerm :: False:True:null_eqTerm:null_!EQ null_!EQ :: False:True:null_eqTerm:null_!EQ const :: c18:c16:c17:c19 const3 :: c33:c23:c24:c28:c29 Rewrite Strategy: INNERMOST ---------------------------------------- (53) NarrowingProof (BOTH BOUNDS(ID, ID)) Narrowed the inner basic terms of all right-hand sides by a single narrowing step. ---------------------------------------- (54) Obligation: Runtime Complexity Weighted TRS where critical functions are completely defined. The underlying TRS is: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: SUBST(App(z0', z1'), z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](False, App(z0', z1'), z1, Lam(z2, z3)), EQTERM(App(z0', z1'), V(z2))) [1] SUBST(Lam(z0'', z1''), z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0'', z1''), z1, Lam(z2, z3)), EQTERM(Lam(z0'', z1''), V(z2))) [1] SUBST(V(z01), z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](!EQ(z01, z2), V(z01), z1, Lam(z2, z3)), EQTERM(V(z01), V(z2))) [1] SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](null_eqTerm, z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) [1] RED(App(App(z02, z11), z1)) -> c20(RED[LET](App(App(z02, z11), z1), red[Let](App(z02, z11), red(z02))), RED(App(z02, z11))) [1] RED(App(Lam(z03, z12), z1)) -> c20(RED[LET](App(Lam(z03, z12), z1), Lam(z03, z12)), RED(Lam(z03, z12))) [1] RED(App(V(z04), z1)) -> c20(RED[LET](App(V(z04), z1), V(z04)), RED(V(z04))) [1] RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), const1), RED(z0)) [1] RED(Lam(z0, z1)) -> c21 [1] RED(V(z0)) -> c22 [1] EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) [1] MKLAM(V(z0), z1) -> c34 [1] SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) [1] SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) [1] SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) [1] !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) [0] RED[LET][LET](z0, Lam(z1, App(z2', z3')), z3) -> c8(RED(mkapp(subst(V(z1), z3, z2'), subst(V(z1), z3, z3'))), SUBST(V(z1), z3, App(z2', z3'))) [0] RED[LET][LET](z0, Lam(z1, Lam(z2'', z3'')), z3) -> c8(RED(subst[True][Ite](eqTerm(V(z1), V(z2'')), V(z1), z3, Lam(z2'', z3''))), SUBST(V(z1), z3, Lam(z2'', z3''))) [0] RED[LET][LET](z0, Lam(z1, V(z21)), z3) -> c8(RED(subst[Ite](eqTerm(V(z1), V(z21)), V(z1), z3, V(z21))), SUBST(V(z1), z3, V(z21))) [0] RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(const1), SUBST(V(z1), z3, z2)) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, App(z22, z31))) -> c11(MKLAM(V(z2), mkapp(subst(z0, z1, z22), subst(z0, z1, z31))), SUBST(z0, z1, App(z22, z31))) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, Lam(z23, z32))) -> c11(MKLAM(V(z2), subst[True][Ite](eqTerm(z0, V(z23)), z0, z1, Lam(z23, z32))), SUBST(z0, z1, Lam(z23, z32))) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, V(z24))) -> c11(MKLAM(V(z2), subst[Ite](eqTerm(z0, V(z24)), z0, z1, V(z24))), SUBST(z0, z1, V(z24))) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), const1), SUBST(z0, z1, z3)) [0] RED[LET](App(z0, App(z05, z13)), z2) -> c13(RED[LET][LET](App(z0, App(z05, z13)), z2, red[Let](App(z05, z13), red(z05))), RED(App(z05, z13))) [0] RED[LET](App(z0, Lam(z06, z14)), z2) -> c13(RED[LET][LET](App(z0, Lam(z06, z14)), z2, Lam(z06, z14)), RED(Lam(z06, z14))) [0] RED[LET](App(z0, V(z07)), z2) -> c13(RED[LET][LET](App(z0, V(z07)), z2, V(z07)), RED(V(z07))) [0] RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, const1), RED(z1)) [0] subst(z0, z1, App(App(z25, z33), App(z28, z35))) -> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), mkapp(subst(z0, z1, z28), subst(z0, z1, z35))) [0] subst(z0, z1, App(App(z25, z33), Lam(z29, z36))) -> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), subst[True][Ite](eqTerm(z0, V(z29)), z0, z1, Lam(z29, z36))) [0] subst(z0, z1, App(App(z25, z33), V(z210))) -> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), subst[Ite](eqTerm(z0, V(z210)), z0, z1, V(z210))) [0] subst(z0, z1, App(App(z25, z33), z3)) -> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), const1) [0] subst(z0, z1, App(Lam(z26, z34), App(z211, z37))) -> mkapp(subst[True][Ite](eqTerm(z0, V(z26)), z0, z1, Lam(z26, z34)), mkapp(subst(z0, z1, z211), subst(z0, z1, z37))) [0] subst(z0, z1, App(Lam(z26, z34), Lam(z212, z38))) -> mkapp(subst[True][Ite](eqTerm(z0, V(z26)), z0, z1, Lam(z26, z34)), subst[True][Ite](eqTerm(z0, V(z212)), z0, z1, Lam(z212, z38))) [0] subst(z0, z1, App(Lam(z26, z34), V(z213))) -> mkapp(subst[True][Ite](eqTerm(z0, V(z26)), z0, z1, Lam(z26, z34)), subst[Ite](eqTerm(z0, V(z213)), z0, z1, V(z213))) [0] subst(z0, z1, App(Lam(z26, z34), z3)) -> mkapp(subst[True][Ite](eqTerm(z0, V(z26)), z0, z1, Lam(z26, z34)), const1) [0] subst(z0, z1, App(V(z27), App(z214, z39))) -> mkapp(subst[Ite](eqTerm(z0, V(z27)), z0, z1, V(z27)), mkapp(subst(z0, z1, z214), subst(z0, z1, z39))) [0] subst(z0, z1, App(V(z27), Lam(z215, z310))) -> mkapp(subst[Ite](eqTerm(z0, V(z27)), z0, z1, V(z27)), subst[True][Ite](eqTerm(z0, V(z215)), z0, z1, Lam(z215, z310))) [0] subst(z0, z1, App(V(z27), V(z216))) -> mkapp(subst[Ite](eqTerm(z0, V(z27)), z0, z1, V(z27)), subst[Ite](eqTerm(z0, V(z216)), z0, z1, V(z216))) [0] subst(z0, z1, App(V(z27), z3)) -> mkapp(subst[Ite](eqTerm(z0, V(z27)), z0, z1, V(z27)), const1) [0] subst(z0, z1, App(z2, App(z217, z311))) -> mkapp(const1, mkapp(subst(z0, z1, z217), subst(z0, z1, z311))) [0] subst(z0, z1, App(z2, Lam(z218, z312))) -> mkapp(const1, subst[True][Ite](eqTerm(z0, V(z218)), z0, z1, Lam(z218, z312))) [0] subst(z0, z1, App(z2, V(z219))) -> mkapp(const1, subst[Ite](eqTerm(z0, V(z219)), z0, z1, V(z219))) [0] subst(z0, z1, App(z2, z3)) -> mkapp(const1, const1) [0] subst(App(z08, z15), z1, Lam(z2, z3)) -> subst[True][Ite](False, App(z08, z15), z1, Lam(z2, z3)) [0] subst(Lam(z09, z16), z1, Lam(z2, z3)) -> subst[True][Ite](False, Lam(z09, z16), z1, Lam(z2, z3)) [0] subst(V(z010), z1, Lam(z2, z3)) -> subst[True][Ite](!EQ(z010, z2), V(z010), z1, Lam(z2, z3)) [0] subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](null_eqTerm, z0, z1, Lam(z2, z3)) [0] subst(App(z011, z17), z1, V(z2)) -> subst[Ite](False, App(z011, z17), z1, V(z2)) [0] subst(Lam(z012, z18), z1, V(z2)) -> subst[Ite](False, Lam(z012, z18), z1, V(z2)) [0] subst(V(z013), z1, V(z2)) -> subst[Ite](!EQ(z013, z2), V(z013), z1, V(z2)) [0] subst(z0, z1, V(z2)) -> subst[Ite](null_eqTerm, z0, z1, V(z2)) [0] mkapp(z0, z1) -> App(z0, z1) [0] subst[True][Ite](False, z0, z1, Lam(z2, App(z220, z313))) -> mklam(V(z2), mkapp(subst(z0, z1, z220), subst(z0, z1, z313))) [0] subst[True][Ite](False, z0, z1, Lam(z2, Lam(z221, z314))) -> mklam(V(z2), subst[True][Ite](eqTerm(z0, V(z221)), z0, z1, Lam(z221, z314))) [0] subst[True][Ite](False, z0, z1, Lam(z2, V(z222))) -> mklam(V(z2), subst[Ite](eqTerm(z0, V(z222)), z0, z1, V(z222))) [0] subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), const1) [0] subst[True][Ite](True, z0, z1, z2) -> z2 [0] eqTerm(App(z0, z1), V(z2)) -> False [0] eqTerm(Lam(z0, z1), V(z2)) -> False [0] eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) [0] !EQ(S(z0), S(z1)) -> !EQ(z0, z1) [0] !EQ(0, S(z0)) -> False [0] !EQ(S(z0), 0) -> False [0] !EQ(0, 0) -> True [0] mklam(V(z0), z1) -> Lam(z0, z1) [0] subst[Ite](False, z0, z1, z2) -> z2 [0] subst[Ite](True, z0, z1, z2) -> z1 [0] red(App(App(z014, z19), z1)) -> red[Let](App(App(z014, z19), z1), red[Let](App(z014, z19), red(z014))) [0] red(App(Lam(z015, z110), z1)) -> red[Let](App(Lam(z015, z110), z1), Lam(z015, z110)) [0] red(App(V(z016), z1)) -> red[Let](App(V(z016), z1), V(z016)) [0] red(App(z0, z1)) -> red[Let](App(z0, z1), const1) [0] red(Lam(z0, z1)) -> Lam(z0, z1) [0] red(V(z0)) -> V(z0) [0] red[Let](App(z0, App(z017, z111)), z2) -> red[Let][Let](App(z0, App(z017, z111)), z2, red[Let](App(z017, z111), red(z017))) [0] red[Let](App(z0, Lam(z018, z112)), z2) -> red[Let][Let](App(z0, Lam(z018, z112)), z2, Lam(z018, z112)) [0] red[Let](App(z0, V(z019)), z2) -> red[Let][Let](App(z0, V(z019)), z2, V(z019)) [0] red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, const1) [0] red[Let][Let](z0, Lam(z1, App(z223, z315)), z3) -> red(mkapp(subst(V(z1), z3, z223), subst(V(z1), z3, z315))) [0] red[Let][Let](z0, Lam(z1, Lam(z224, z316)), z3) -> red(subst[True][Ite](eqTerm(V(z1), V(z224)), V(z1), z3, Lam(z224, z316))) [0] red[Let][Let](z0, Lam(z1, V(z225)), z3) -> red(subst[Ite](eqTerm(V(z1), V(z225)), V(z1), z3, V(z225))) [0] red[Let][Let](z0, Lam(z1, z2), z3) -> red(const1) [0] red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) [0] red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) [0] !EQ'(v0, v1) -> const5 [0] RED[LET][LET](v0, v1, v2) -> const6 [0] SUBST[TRUE][ITE](v0, v1, v2, v3) -> const2 [0] RED[LET](v0, v1) -> const4 [0] subst(v0, v1, v2) -> const1 [0] mkapp(v0, v1) -> const1 [0] subst[True][Ite](v0, v1, v2, v3) -> const1 [0] eqTerm(v0, v1) -> null_eqTerm [0] !EQ(v0, v1) -> null_!EQ [0] mklam(v0, v1) -> const1 [0] subst[Ite](v0, v1, v2, v3) -> const1 [0] red(v0) -> const1 [0] red[Let](v0, v1) -> const1 [0] red[Let][Let](v0, v1, v2) -> const1 [0] The TRS has the following type information: SUBST :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> c18:c16:c17:c19 Lam :: S:0 -> Lam:V:App:const1 -> Lam:V:App:const1 c18 :: c11:const2 -> c33:c23:c24:c28:c29 -> c18:c16:c17:c19 SUBST[TRUE][ITE] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> c11:const2 eqTerm :: Lam:V:App:const1 -> Lam:V:App:const1 -> False:True:null_eqTerm:null_!EQ V :: S:0 -> Lam:V:App:const1 EQTERM :: Lam:V:App:const1 -> Lam:V:App:const1 -> c33:c23:c24:c28:c29 RED :: Lam:V:App:const1 -> c20:c21:c22 App :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 c20 :: c13:const4 -> c20:c21:c22 -> c20:c21:c22 RED[LET] :: Lam:V:App:const1 -> Lam:V:App:const1 -> c13:const4 red :: Lam:V:App:const1 -> Lam:V:App:const1 c21 :: c20:c21:c22 c22 :: c20:c21:c22 c33 :: c4:const5 -> c33:c23:c24:c28:c29 !EQ' :: S:0 -> S:0 -> c4:const5 MKLAM :: Lam:V:App:const1 -> Lam:V:App:const1 -> c34 c34 :: c34 c16 :: c18:c16:c17:c19 -> c18:c16:c17:c19 c17 :: c18:c16:c17:c19 -> c18:c16:c17:c19 c19 :: c33:c23:c24:c28:c29 -> c18:c16:c17:c19 c23 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 c24 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 c28 :: c4:const5 -> c33:c23:c24:c28:c29 c29 :: c33:c23:c24:c28:c29 -> c33:c23:c24:c28:c29 S :: S:0 -> S:0 c4 :: c4:const5 -> c4:const5 RED[LET][LET] :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> c8:const6 c8 :: c20:c21:c22 -> c18:c16:c17:c19 -> c8:const6 subst :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 False :: False:True:null_eqTerm:null_!EQ c11 :: c34 -> c18:c16:c17:c19 -> c11:const2 c13 :: c8:const6 -> c20:c21:c22 -> c13:const4 mkapp :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 subst[True][Ite] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 subst[Ite] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 mklam :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 True :: False:True:null_eqTerm:null_!EQ !EQ :: S:0 -> S:0 -> False:True:null_eqTerm:null_!EQ 0 :: S:0 red[Let] :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 red[Let][Let] :: Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 -> Lam:V:App:const1 const5 :: c4:const5 const6 :: c8:const6 const2 :: c11:const2 const4 :: c13:const4 const1 :: Lam:V:App:const1 null_eqTerm :: False:True:null_eqTerm:null_!EQ null_!EQ :: False:True:null_eqTerm:null_!EQ const :: c18:c16:c17:c19 const3 :: c33:c23:c24:c28:c29 Rewrite Strategy: INNERMOST ---------------------------------------- (55) CpxTypedWeightedTrsToRntsProof (UPPER BOUND(ID)) Transformed the TRS into an over-approximating RNTS by (improved) Size Abstraction. The constant constructors are abstracted as follows: c21 => 0 c22 => 1 c34 => 0 False => 1 True => 2 0 => 0 const5 => 0 const6 => 0 const2 => 0 const4 => 0 const1 => 0 null_eqTerm => 0 null_!EQ => 0 const => 0 const3 => 0 ---------------------------------------- (56) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z0 >= 0, z' = 1 + z0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: z = 1 + z0, z0 >= 0, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ(z, z') -{ 0 }-> !EQ(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 !EQ'(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ'(z, z') -{ 0 }-> 1 + !EQ'(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z1, z3) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 MKLAM(z, z') -{ 1 }-> 0 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 RED(z) -{ 1 }-> 1 :|: z = 1 + z0, z0 >= 0 RED(z) -{ 1 }-> 0 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + z0 + z1, 0) + RED(z0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z04) + z1, 1 + z04) + RED(1 + z04) :|: z04 >= 0, z1 >= 0, z = 1 + (1 + z04) + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z02 + z11) + z1, red[Let](1 + z02 + z11, red(z02))) + RED(1 + z02 + z11) :|: z = 1 + (1 + z02 + z11) + z1, z11 >= 0, z1 >= 0, z02 >= 0 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z03 + z12) + z1, 1 + z03 + z12) + RED(1 + z03 + z12) :|: z1 >= 0, z12 >= 0, z = 1 + (1 + z03 + z12) + z1, z03 >= 0 RED[LET](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + z1, z2, 0) + RED(z1) :|: z1 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + z1, z2 >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z07), z2, 1 + z07) + RED(1 + z07) :|: z07 >= 0, z = 1 + z0 + (1 + z07), z' = z2, z0 >= 0, z2 >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z05 + z13), z2, red[Let](1 + z05 + z13, red(z05))) + RED(1 + z05 + z13) :|: z' = z2, z0 >= 0, z = 1 + z0 + (1 + z05 + z13), z05 >= 0, z13 >= 0, z2 >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z06 + z14), z2, 1 + z06 + z14) + RED(1 + z06 + z14) :|: z06 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + (1 + z06 + z14), z14 >= 0, z2 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst[True][Ite](eqTerm(1 + z1, 1 + z2''), 1 + z1, z3, 1 + z2'' + z3'')) + SUBST(1 + z1, z3, 1 + z2'' + z3'') :|: z = z0, z1 >= 0, z0 >= 0, z3'' >= 0, z'' = z3, z2'' >= 0, z' = 1 + z1 + (1 + z2'' + z3''), z3 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst[Ite](eqTerm(1 + z1, 1 + z21), 1 + z1, z3, 1 + z21)) + SUBST(1 + z1, z3, 1 + z21) :|: z21 >= 0, z = z0, z1 >= 0, z' = 1 + z1 + (1 + z21), z0 >= 0, z'' = z3, z3 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(mkapp(subst(1 + z1, z3, z2'), subst(1 + z1, z3, z3'))) + SUBST(1 + z1, z3, 1 + z2' + z3') :|: z = z0, z1 >= 0, z3' >= 0, z2' >= 0, z0 >= 0, z' = 1 + z1 + (1 + z2' + z3'), z'' = z3, z3 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(0) + SUBST(1 + z1, z3, z2) :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z0, z1, z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z0, z1, z3) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + EQTERM(z0, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2, z2 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](1, 1 + z0' + z1', z1, 1 + z2 + z3) + EQTERM(1 + z0' + z1', 1 + z2) :|: z1 >= 0, z0' >= 0, z1' >= 0, z' = z1, z'' = 1 + z2 + z3, z = 1 + z0' + z1', z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](1, 1 + z0'' + z1'', z1, 1 + z2 + z3) + EQTERM(1 + z0'' + z1'', 1 + z2) :|: z = 1 + z0'' + z1'', z1 >= 0, z' = z1, z'' = 1 + z2 + z3, z0'' >= 0, z2 >= 0, z3 >= 0, z1'' >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](0, z0, z1, 1 + z2 + z3) + EQTERM(z0, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](!EQ(z01, z2), 1 + z01, z1, 1 + z2 + z3) + EQTERM(1 + z01, 1 + z2) :|: z1 >= 0, z01 >= 0, z = 1 + z01, z' = z1, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst[True][Ite](eqTerm(z0, 1 + z23), z0, z1, 1 + z23 + z32)) + SUBST(z0, z1, 1 + z23 + z32) :|: z1 >= 0, z32 >= 0, z = 1, z4 = 1 + z2 + (1 + z23 + z32), z23 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst[Ite](eqTerm(z0, 1 + z24), z0, z1, 1 + z24)) + SUBST(z0, z1, 1 + z24) :|: z1 >= 0, z = 1, z0 >= 0, z24 >= 0, z4 = 1 + z2 + (1 + z24), z' = z0, z2 >= 0, z'' = z1 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, mkapp(subst(z0, z1, z22), subst(z0, z1, z31))) + SUBST(z0, z1, 1 + z22 + z31) :|: z1 >= 0, z31 >= 0, z4 = 1 + z2 + (1 + z22 + z31), z = 1, z0 >= 0, z22 >= 0, z' = z0, z2 >= 0, z'' = z1 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, 0) + SUBST(z0, z1, z3) :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1 eqTerm(z, z') -{ 0 }-> 1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1, z' = 1 + z2, z2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 eqTerm(z, z') -{ 0 }-> !EQ(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 mkapp(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mkapp(z, z') -{ 0 }-> 1 + z0 + z1 :|: z = z0, z1 >= 0, z' = z1, z0 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 red(z) -{ 0 }-> red[Let](1 + z0 + z1, 0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red(z) -{ 0 }-> red[Let](1 + (1 + z016) + z1, 1 + z016) :|: z1 >= 0, z016 >= 0, z = 1 + (1 + z016) + z1 red(z) -{ 0 }-> red[Let](1 + (1 + z014 + z19) + z1, red[Let](1 + z014 + z19, red(z014))) :|: z1 >= 0, z19 >= 0, z = 1 + (1 + z014 + z19) + z1, z014 >= 0 red(z) -{ 0 }-> red[Let](1 + (1 + z015 + z110) + z1, 1 + z015 + z110) :|: z015 >= 0, z110 >= 0, z1 >= 0, z = 1 + (1 + z015 + z110) + z1 red(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 red(z) -{ 0 }-> 1 + z0 :|: z = 1 + z0, z0 >= 0 red(z) -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + z1, z2, 0) :|: z1 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + z1, z2 >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z019), z2, 1 + z019) :|: z019 >= 0, z = 1 + z0 + (1 + z019), z' = z2, z0 >= 0, z2 >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z017 + z111), z2, red[Let](1 + z017 + z111, red(z017))) :|: z = 1 + z0 + (1 + z017 + z111), z' = z2, z0 >= 0, z111 >= 0, z017 >= 0, z2 >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z018 + z112), z2, 1 + z018 + z112) :|: z = 1 + z0 + (1 + z018 + z112), z112 >= 0, z' = z2, z0 >= 0, z018 >= 0, z2 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 red[Let][Let](z, z', z'') -{ 0 }-> red(subst[True][Ite](eqTerm(1 + z1, 1 + z224), 1 + z1, z3, 1 + z224 + z316)) :|: z = z0, z1 >= 0, z316 >= 0, z' = 1 + z1 + (1 + z224 + z316), z0 >= 0, z'' = z3, z224 >= 0, z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(subst[Ite](eqTerm(1 + z1, 1 + z225), 1 + z1, z3, 1 + z225)) :|: z = z0, z1 >= 0, z' = 1 + z1 + (1 + z225), z0 >= 0, z'' = z3, z3 >= 0, z225 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(mkapp(subst(1 + z1, z3, z223), subst(1 + z1, z3, z315))) :|: z315 >= 0, z = z0, z1 >= 0, z223 >= 0, z0 >= 0, z'' = z3, z' = 1 + z1 + (1 + z223 + z315), z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(0) :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1) + z2 :|: z'' = z2, z = z0, z1 >= 0, z0 >= 0, z' = 1 + z1, z2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1 + z2) + z3 :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](1, 1 + z08 + z15, z1, 1 + z2 + z3) :|: z08 >= 0, z15 >= 0, z1 >= 0, z = 1 + z08 + z15, z' = z1, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](1, 1 + z09 + z16, z1, 1 + z2 + z3) :|: z1 >= 0, z = 1 + z09 + z16, z' = z1, z16 >= 0, z09 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](0, z0, z1, 1 + z2 + z3) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](!EQ(z010, z2), 1 + z010, z1, 1 + z2 + z3) :|: z1 >= 0, z' = z1, z'' = 1 + z2 + z3, z010 >= 0, z2 >= 0, z3 >= 0, z = 1 + z010 subst(z, z', z'') -{ 0 }-> subst[Ite](1, 1 + z011 + z17, z1, 1 + z2) :|: z011 >= 0, z1 >= 0, z = 1 + z011 + z17, z17 >= 0, z' = z1, z'' = 1 + z2, z2 >= 0 subst(z, z', z'') -{ 0 }-> subst[Ite](1, 1 + z012 + z18, z1, 1 + z2) :|: z18 >= 0, z1 >= 0, z' = z1, z012 >= 0, z'' = 1 + z2, z = 1 + z012 + z18, z2 >= 0 subst(z, z', z'') -{ 0 }-> subst[Ite](0, z0, z1, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2, z2 >= 0 subst(z, z', z'') -{ 0 }-> subst[Ite](!EQ(z013, z2), 1 + z013, z1, 1 + z2) :|: z1 >= 0, z = 1 + z013, z013 >= 0, z' = z1, z'' = 1 + z2, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), subst[True][Ite](eqTerm(z0, 1 + z212), z0, z1, 1 + z212 + z38)) :|: z212 >= 0, z = z0, z1 >= 0, z'' = 1 + (1 + z26 + z34) + (1 + z212 + z38), z26 >= 0, z38 >= 0, z' = z1, z0 >= 0, z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), subst[Ite](eqTerm(z0, 1 + z213), z0, z1, 1 + z213)) :|: z = z0, z'' = 1 + (1 + z26 + z34) + (1 + z213), z1 >= 0, z213 >= 0, z26 >= 0, z' = z1, z0 >= 0, z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), mkapp(subst(z0, z1, z211), subst(z0, z1, z37))) :|: z = z0, z1 >= 0, z26 >= 0, z211 >= 0, z37 >= 0, z' = z1, z0 >= 0, z'' = 1 + (1 + z26 + z34) + (1 + z211 + z37), z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), 0) :|: z = z0, z1 >= 0, z26 >= 0, z'' = 1 + (1 + z26 + z34) + z3, z' = z1, z0 >= 0, z34 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), subst[True][Ite](eqTerm(z0, 1 + z215), z0, z1, 1 + z215 + z310)) :|: z = z0, z1 >= 0, z'' = 1 + (1 + z27) + (1 + z215 + z310), z27 >= 0, z310 >= 0, z' = z1, z0 >= 0, z215 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), subst[Ite](eqTerm(z0, 1 + z216), z0, z1, 1 + z216)) :|: z216 >= 0, z = z0, z1 >= 0, z27 >= 0, z' = z1, z0 >= 0, z'' = 1 + (1 + z27) + (1 + z216) subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), mkapp(subst(z0, z1, z214), subst(z0, z1, z39))) :|: z = z0, z1 >= 0, z39 >= 0, z27 >= 0, z214 >= 0, z' = z1, z0 >= 0, z'' = 1 + (1 + z27) + (1 + z214 + z39) subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), 0) :|: z'' = 1 + (1 + z27) + z3, z = z0, z1 >= 0, z27 >= 0, z' = z1, z0 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), subst[True][Ite](eqTerm(z0, 1 + z29), z0, z1, 1 + z29 + z36)) :|: z25 >= 0, z = z0, z1 >= 0, z29 >= 0, z36 >= 0, z' = z1, z0 >= 0, z33 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z29 + z36) subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), subst[Ite](eqTerm(z0, 1 + z210), z0, z1, 1 + z210)) :|: z25 >= 0, z = z0, z1 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z210), z210 >= 0, z' = z1, z0 >= 0, z33 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), mkapp(subst(z0, z1, z28), subst(z0, z1, z35))) :|: z25 >= 0, z = z0, z1 >= 0, z35 >= 0, z28 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z28 + z35), z' = z1, z0 >= 0, z33 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), 0) :|: z25 >= 0, z = z0, z1 >= 0, z'' = 1 + (1 + z25 + z33) + z3, z' = z1, z0 >= 0, z33 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, subst[True][Ite](eqTerm(z0, 1 + z218), z0, z1, 1 + z218 + z312)) :|: z = z0, z1 >= 0, z312 >= 0, z218 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + (1 + z218 + z312), z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, subst[Ite](eqTerm(z0, 1 + z219), z0, z1, 1 + z219)) :|: z = z0, z1 >= 0, z'' = 1 + z2 + (1 + z219), z219 >= 0, z' = z1, z0 >= 0, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, mkapp(subst(z0, z1, z217), subst(z0, z1, z311))) :|: z311 >= 0, z = z0, z1 >= 0, z'' = 1 + z2 + (1 + z217 + z311), z217 >= 0, z' = z1, z0 >= 0, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, 0) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> z1 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst[True][Ite](eqTerm(z0, 1 + z221), z0, z1, 1 + z221 + z314)) :|: z1 >= 0, z = 1, z221 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = 1 + z2 + (1 + z221 + z314), z314 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst[Ite](eqTerm(z0, 1 + z222), z0, z1, 1 + z222)) :|: z1 >= 0, z = 1, z222 >= 0, z4 = 1 + z2 + (1 + z222), z0 >= 0, z' = z0, z2 >= 0, z'' = z1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, mkapp(subst(z0, z1, z220), subst(z0, z1, z313))) :|: z1 >= 0, z = 1, z220 >= 0, z313 >= 0, z0 >= 0, z4 = 1 + z2 + (1 + z220 + z313), z' = z0, z2 >= 0, z'' = z1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, 0) :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 ---------------------------------------- (57) InliningProof (UPPER BOUND(ID)) Inlined the following terminating rules on right-hand sides where appropriate: MKLAM(z, z') -{ 1 }-> 0 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 mkapp(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mkapp(z, z') -{ 0 }-> 1 + z0 + z1 :|: z = z0, z1 >= 0, z' = z1, z0 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> z1 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 ---------------------------------------- (58) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z0 >= 0, z' = 1 + z0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: z = 1 + z0, z0 >= 0, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ(z, z') -{ 0 }-> !EQ(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 !EQ'(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ'(z, z') -{ 0 }-> 1 + !EQ'(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z1, z3) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 MKLAM(z, z') -{ 1 }-> 0 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 RED(z) -{ 1 }-> 1 :|: z = 1 + z0, z0 >= 0 RED(z) -{ 1 }-> 0 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + z0 + z1, 0) + RED(z0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z04) + z1, 1 + z04) + RED(1 + z04) :|: z04 >= 0, z1 >= 0, z = 1 + (1 + z04) + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z02 + z11) + z1, red[Let](1 + z02 + z11, red(z02))) + RED(1 + z02 + z11) :|: z = 1 + (1 + z02 + z11) + z1, z11 >= 0, z1 >= 0, z02 >= 0 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z03 + z12) + z1, 1 + z03 + z12) + RED(1 + z03 + z12) :|: z1 >= 0, z12 >= 0, z = 1 + (1 + z03 + z12) + z1, z03 >= 0 RED[LET](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + z1, z2, 0) + RED(z1) :|: z1 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + z1, z2 >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z07), z2, 1 + z07) + RED(1 + z07) :|: z07 >= 0, z = 1 + z0 + (1 + z07), z' = z2, z0 >= 0, z2 >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z05 + z13), z2, red[Let](1 + z05 + z13, red(z05))) + RED(1 + z05 + z13) :|: z' = z2, z0 >= 0, z = 1 + z0 + (1 + z05 + z13), z05 >= 0, z13 >= 0, z2 >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z06 + z14), z2, 1 + z06 + z14) + RED(1 + z06 + z14) :|: z06 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + (1 + z06 + z14), z14 >= 0, z2 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst[True][Ite](eqTerm(1 + z1, 1 + z2''), 1 + z1, z3, 1 + z2'' + z3'')) + SUBST(1 + z1, z3, 1 + z2'' + z3'') :|: z = z0, z1 >= 0, z0 >= 0, z3'' >= 0, z'' = z3, z2'' >= 0, z' = 1 + z1 + (1 + z2'' + z3''), z3 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst[Ite](eqTerm(1 + z1, 1 + z21), 1 + z1, z3, 1 + z21)) + SUBST(1 + z1, z3, 1 + z21) :|: z21 >= 0, z = z0, z1 >= 0, z' = 1 + z1 + (1 + z21), z0 >= 0, z'' = z3, z3 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(mkapp(subst(1 + z1, z3, z2'), subst(1 + z1, z3, z3'))) + SUBST(1 + z1, z3, 1 + z2' + z3') :|: z = z0, z1 >= 0, z3' >= 0, z2' >= 0, z0 >= 0, z' = 1 + z1 + (1 + z2' + z3'), z'' = z3, z3 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(0) + SUBST(1 + z1, z3, z2) :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z0, z1, z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z0, z1, z3) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + EQTERM(z0, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2, z2 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](1, 1 + z0' + z1', z1, 1 + z2 + z3) + EQTERM(1 + z0' + z1', 1 + z2) :|: z1 >= 0, z0' >= 0, z1' >= 0, z' = z1, z'' = 1 + z2 + z3, z = 1 + z0' + z1', z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](1, 1 + z0'' + z1'', z1, 1 + z2 + z3) + EQTERM(1 + z0'' + z1'', 1 + z2) :|: z = 1 + z0'' + z1'', z1 >= 0, z' = z1, z'' = 1 + z2 + z3, z0'' >= 0, z2 >= 0, z3 >= 0, z1'' >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](0, z0, z1, 1 + z2 + z3) + EQTERM(z0, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](!EQ(z01, z2), 1 + z01, z1, 1 + z2 + z3) + EQTERM(1 + z01, 1 + z2) :|: z1 >= 0, z01 >= 0, z = 1 + z01, z' = z1, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst[True][Ite](eqTerm(z0, 1 + z23), z0, z1, 1 + z23 + z32)) + SUBST(z0, z1, 1 + z23 + z32) :|: z1 >= 0, z32 >= 0, z = 1, z4 = 1 + z2 + (1 + z23 + z32), z23 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst[Ite](eqTerm(z0, 1 + z24), z0, z1, 1 + z24)) + SUBST(z0, z1, 1 + z24) :|: z1 >= 0, z = 1, z0 >= 0, z24 >= 0, z4 = 1 + z2 + (1 + z24), z' = z0, z2 >= 0, z'' = z1 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, mkapp(subst(z0, z1, z22), subst(z0, z1, z31))) + SUBST(z0, z1, 1 + z22 + z31) :|: z1 >= 0, z31 >= 0, z4 = 1 + z2 + (1 + z22 + z31), z = 1, z0 >= 0, z22 >= 0, z' = z0, z2 >= 0, z'' = z1 SUBST[TRUE][ITE](z, z', z'', z4) -{ 1 }-> 1 + 0 + SUBST(z0, z1, z3) :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1, z1' >= 0, 1 + z2 = 1 + z0', 0 = z1', z0' >= 0 eqTerm(z, z') -{ 0 }-> 1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1, z' = 1 + z2, z2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 eqTerm(z, z') -{ 0 }-> !EQ(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 mkapp(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mkapp(z, z') -{ 0 }-> 1 + z0 + z1 :|: z = z0, z1 >= 0, z' = z1, z0 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 red(z) -{ 0 }-> red[Let](1 + z0 + z1, 0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red(z) -{ 0 }-> red[Let](1 + (1 + z016) + z1, 1 + z016) :|: z1 >= 0, z016 >= 0, z = 1 + (1 + z016) + z1 red(z) -{ 0 }-> red[Let](1 + (1 + z014 + z19) + z1, red[Let](1 + z014 + z19, red(z014))) :|: z1 >= 0, z19 >= 0, z = 1 + (1 + z014 + z19) + z1, z014 >= 0 red(z) -{ 0 }-> red[Let](1 + (1 + z015 + z110) + z1, 1 + z015 + z110) :|: z015 >= 0, z110 >= 0, z1 >= 0, z = 1 + (1 + z015 + z110) + z1 red(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 red(z) -{ 0 }-> 1 + z0 :|: z = 1 + z0, z0 >= 0 red(z) -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + z1, z2, 0) :|: z1 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + z1, z2 >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z019), z2, 1 + z019) :|: z019 >= 0, z = 1 + z0 + (1 + z019), z' = z2, z0 >= 0, z2 >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z017 + z111), z2, red[Let](1 + z017 + z111, red(z017))) :|: z = 1 + z0 + (1 + z017 + z111), z' = z2, z0 >= 0, z111 >= 0, z017 >= 0, z2 >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z018 + z112), z2, 1 + z018 + z112) :|: z = 1 + z0 + (1 + z018 + z112), z112 >= 0, z' = z2, z0 >= 0, z018 >= 0, z2 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 red[Let][Let](z, z', z'') -{ 0 }-> red(subst[True][Ite](eqTerm(1 + z1, 1 + z224), 1 + z1, z3, 1 + z224 + z316)) :|: z = z0, z1 >= 0, z316 >= 0, z' = 1 + z1 + (1 + z224 + z316), z0 >= 0, z'' = z3, z224 >= 0, z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(subst[Ite](eqTerm(1 + z1, 1 + z225), 1 + z1, z3, 1 + z225)) :|: z = z0, z1 >= 0, z' = 1 + z1 + (1 + z225), z0 >= 0, z'' = z3, z3 >= 0, z225 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(mkapp(subst(1 + z1, z3, z223), subst(1 + z1, z3, z315))) :|: z315 >= 0, z = z0, z1 >= 0, z223 >= 0, z0 >= 0, z'' = z3, z' = 1 + z1 + (1 + z223 + z315), z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(0) :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1) + z2 :|: z'' = z2, z = z0, z1 >= 0, z0 >= 0, z' = 1 + z1, z2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1 + z2) + z3 :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> z2' :|: z011 >= 0, z1 >= 0, z = 1 + z011 + z17, z17 >= 0, z' = z1, z'' = 1 + z2, z2 >= 0, z1' >= 0, 1 = 1, z0 >= 0, 1 + z011 + z17 = z0, z2' >= 0, z1 = z1', 1 + z2 = z2' subst(z, z', z'') -{ 0 }-> z2' :|: z18 >= 0, z1 >= 0, z' = z1, z012 >= 0, z'' = 1 + z2, z = 1 + z012 + z18, z2 >= 0, z1' >= 0, 1 = 1, z0 >= 0, 1 + z012 + z18 = z0, z2' >= 0, z1 = z1', 1 + z2 = z2' subst(z, z', z'') -{ 0 }-> subst[True][Ite](1, 1 + z08 + z15, z1, 1 + z2 + z3) :|: z08 >= 0, z15 >= 0, z1 >= 0, z = 1 + z08 + z15, z' = z1, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](1, 1 + z09 + z16, z1, 1 + z2 + z3) :|: z1 >= 0, z = 1 + z09 + z16, z' = z1, z16 >= 0, z09 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](0, z0, z1, 1 + z2 + z3) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](!EQ(z010, z2), 1 + z010, z1, 1 + z2 + z3) :|: z1 >= 0, z' = z1, z'' = 1 + z2 + z3, z010 >= 0, z2 >= 0, z3 >= 0, z = 1 + z010 subst(z, z', z'') -{ 0 }-> subst[Ite](!EQ(z013, z2), 1 + z013, z1, 1 + z2) :|: z1 >= 0, z = 1 + z013, z013 >= 0, z' = z1, z'' = 1 + z2, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), subst[True][Ite](eqTerm(z0, 1 + z212), z0, z1, 1 + z212 + z38)) :|: z212 >= 0, z = z0, z1 >= 0, z'' = 1 + (1 + z26 + z34) + (1 + z212 + z38), z26 >= 0, z38 >= 0, z' = z1, z0 >= 0, z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), subst[Ite](eqTerm(z0, 1 + z213), z0, z1, 1 + z213)) :|: z = z0, z'' = 1 + (1 + z26 + z34) + (1 + z213), z1 >= 0, z213 >= 0, z26 >= 0, z' = z1, z0 >= 0, z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), mkapp(subst(z0, z1, z211), subst(z0, z1, z37))) :|: z = z0, z1 >= 0, z26 >= 0, z211 >= 0, z37 >= 0, z' = z1, z0 >= 0, z'' = 1 + (1 + z26 + z34) + (1 + z211 + z37), z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z0, 1 + z26), z0, z1, 1 + z26 + z34), 0) :|: z = z0, z1 >= 0, z26 >= 0, z'' = 1 + (1 + z26 + z34) + z3, z' = z1, z0 >= 0, z34 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), subst[True][Ite](eqTerm(z0, 1 + z215), z0, z1, 1 + z215 + z310)) :|: z = z0, z1 >= 0, z'' = 1 + (1 + z27) + (1 + z215 + z310), z27 >= 0, z310 >= 0, z' = z1, z0 >= 0, z215 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), subst[Ite](eqTerm(z0, 1 + z216), z0, z1, 1 + z216)) :|: z216 >= 0, z = z0, z1 >= 0, z27 >= 0, z' = z1, z0 >= 0, z'' = 1 + (1 + z27) + (1 + z216) subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), mkapp(subst(z0, z1, z214), subst(z0, z1, z39))) :|: z = z0, z1 >= 0, z39 >= 0, z27 >= 0, z214 >= 0, z' = z1, z0 >= 0, z'' = 1 + (1 + z27) + (1 + z214 + z39) subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z0, 1 + z27), z0, z1, 1 + z27), 0) :|: z'' = 1 + (1 + z27) + z3, z = z0, z1 >= 0, z27 >= 0, z' = z1, z0 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), subst[True][Ite](eqTerm(z0, 1 + z29), z0, z1, 1 + z29 + z36)) :|: z25 >= 0, z = z0, z1 >= 0, z29 >= 0, z36 >= 0, z' = z1, z0 >= 0, z33 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z29 + z36) subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), subst[Ite](eqTerm(z0, 1 + z210), z0, z1, 1 + z210)) :|: z25 >= 0, z = z0, z1 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z210), z210 >= 0, z' = z1, z0 >= 0, z33 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), mkapp(subst(z0, z1, z28), subst(z0, z1, z35))) :|: z25 >= 0, z = z0, z1 >= 0, z35 >= 0, z28 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z28 + z35), z' = z1, z0 >= 0, z33 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z0, z1, z25), subst(z0, z1, z33)), 0) :|: z25 >= 0, z = z0, z1 >= 0, z'' = 1 + (1 + z25 + z33) + z3, z' = z1, z0 >= 0, z33 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, subst[True][Ite](eqTerm(z0, 1 + z218), z0, z1, 1 + z218 + z312)) :|: z = z0, z1 >= 0, z312 >= 0, z218 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + (1 + z218 + z312), z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, subst[Ite](eqTerm(z0, 1 + z219), z0, z1, 1 + z219)) :|: z = z0, z1 >= 0, z'' = 1 + z2 + (1 + z219), z219 >= 0, z' = z1, z0 >= 0, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, mkapp(subst(z0, z1, z217), subst(z0, z1, z311))) :|: z311 >= 0, z = z0, z1 >= 0, z'' = 1 + z2 + (1 + z217 + z311), z217 >= 0, z' = z1, z0 >= 0, z2 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0, v0 >= 0, v1 >= 0, 0 = v0, 0 = v1 subst(z, z', z'') -{ 0 }-> 0 :|: z011 >= 0, z1 >= 0, z = 1 + z011 + z17, z17 >= 0, z' = z1, z'' = 1 + z2, z2 >= 0, v0 >= 0, z1 = v2, v1 >= 0, 1 = v0, 1 + z011 + z17 = v1, 1 + z2 = v3, v2 >= 0, v3 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z18 >= 0, z1 >= 0, z' = z1, z012 >= 0, z'' = 1 + z2, z = 1 + z012 + z18, z2 >= 0, v0 >= 0, z1 = v2, v1 >= 0, 1 = v0, 1 + z012 + z18 = v1, 1 + z2 = v3, v2 >= 0, v3 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2, z2 >= 0, v0 >= 0, z1 = v2, v1 >= 0, 0 = v0, z0 = v1, 1 + z2 = v3, v2 >= 0, v3 >= 0 subst(z, z', z'') -{ 0 }-> 1 + z0' + z1' :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0, 0 = z0', z1' >= 0, 0 = z1', z0' >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> z1 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst[True][Ite](eqTerm(z0, 1 + z221), z0, z1, 1 + z221 + z314)) :|: z1 >= 0, z = 1, z221 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = 1 + z2 + (1 + z221 + z314), z314 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst[Ite](eqTerm(z0, 1 + z222), z0, z1, 1 + z222)) :|: z1 >= 0, z = 1, z222 >= 0, z4 = 1 + z2 + (1 + z222), z0 >= 0, z' = z0, z2 >= 0, z'' = z1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, mkapp(subst(z0, z1, z220), subst(z0, z1, z313))) :|: z1 >= 0, z = 1, z220 >= 0, z313 >= 0, z0 >= 0, z4 = 1 + z2 + (1 + z220 + z313), z' = z0, z2 >= 0, z'' = z1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 0 :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1, v0 >= 0, v1 >= 0, 1 + z2 = v0, 0 = v1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 1 + z0' + z1' :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1, z1' >= 0, 1 + z2 = 1 + z0', 0 = z1', z0' >= 0 ---------------------------------------- (59) SimplificationProof (BOTH BOUNDS(ID, ID)) Simplified the RNTS by moving equalities from the constraints into the right-hand sides. ---------------------------------------- (60) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z' - 1 >= 0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: z - 1 >= 0, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 !EQ(z, z') -{ 0 }-> !EQ(z - 1, z' - 1) :|: z' - 1 >= 0, z - 1 >= 0 !EQ'(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 !EQ'(z, z') -{ 0 }-> 1 + !EQ'(z - 1, z' - 1) :|: z' - 1 >= 0, z - 1 >= 0 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z1, z3) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z - 1, z' - 1) :|: z' - 1 >= 0, z - 1 >= 0 MKLAM(z, z') -{ 1 }-> 0 :|: z' >= 0, z - 1 >= 0 RED(z) -{ 1 }-> 1 :|: z - 1 >= 0 RED(z) -{ 1 }-> 0 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + z0 + z1, 0) + RED(z0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z04) + z1, 1 + z04) + RED(1 + z04) :|: z04 >= 0, z1 >= 0, z = 1 + (1 + z04) + z1 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z02 + z11) + z1, red[Let](1 + z02 + z11, red(z02))) + RED(1 + z02 + z11) :|: z = 1 + (1 + z02 + z11) + z1, z11 >= 0, z1 >= 0, z02 >= 0 RED(z) -{ 1 }-> 1 + RED[LET](1 + (1 + z03 + z12) + z1, 1 + z03 + z12) + RED(1 + z03 + z12) :|: z1 >= 0, z12 >= 0, z = 1 + (1 + z03 + z12) + z1, z03 >= 0 RED[LET](z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + z1, z', 0) + RED(z1) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1, z' >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z07), z', 1 + z07) + RED(1 + z07) :|: z07 >= 0, z = 1 + z0 + (1 + z07), z0 >= 0, z' >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z05 + z13), z', red[Let](1 + z05 + z13, red(z05))) + RED(1 + z05 + z13) :|: z0 >= 0, z = 1 + z0 + (1 + z05 + z13), z05 >= 0, z13 >= 0, z' >= 0 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + (1 + z06 + z14), z', 1 + z06 + z14) + RED(1 + z06 + z14) :|: z06 >= 0, z0 >= 0, z = 1 + z0 + (1 + z06 + z14), z14 >= 0, z' >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst[True][Ite](eqTerm(1 + z1, 1 + z2''), 1 + z1, z'', 1 + z2'' + z3'')) + SUBST(1 + z1, z'', 1 + z2'' + z3'') :|: z1 >= 0, z >= 0, z3'' >= 0, z2'' >= 0, z' = 1 + z1 + (1 + z2'' + z3''), z'' >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst[Ite](eqTerm(1 + z1, 1 + z21), 1 + z1, z'', 1 + z21)) + SUBST(1 + z1, z'', 1 + z21) :|: z21 >= 0, z1 >= 0, z' = 1 + z1 + (1 + z21), z >= 0, z'' >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(mkapp(subst(1 + z1, z'', z2'), subst(1 + z1, z'', z3'))) + SUBST(1 + z1, z'', 1 + z2' + z3') :|: z1 >= 0, z3' >= 0, z2' >= 0, z >= 0, z' = 1 + z1 + (1 + z2' + z3'), z'' >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(0) + SUBST(1 + z1, z'', z2) :|: z1 >= 0, z' = 1 + z1 + z2, z >= 0, z2 >= 0, z'' >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z, z', z2) :|: z' >= 0, z >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z, z', z3) :|: z' >= 0, z >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + EQTERM(z, 1 + (z'' - 1)) :|: z' >= 0, z >= 0, z'' - 1 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](1, 1 + z0' + z1', z', 1 + z2 + z3) + EQTERM(1 + z0' + z1', 1 + z2) :|: z' >= 0, z0' >= 0, z1' >= 0, z'' = 1 + z2 + z3, z = 1 + z0' + z1', z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](1, 1 + z0'' + z1'', z', 1 + z2 + z3) + EQTERM(1 + z0'' + z1'', 1 + z2) :|: z = 1 + z0'' + z1'', z' >= 0, z'' = 1 + z2 + z3, z0'' >= 0, z2 >= 0, z3 >= 0, z1'' >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](0, z, z', 1 + z2 + z3) + EQTERM(z, 1 + z2) :|: z' >= 0, z >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](!EQ(z - 1, z2), 1 + (z - 1), z', 1 + z2 + z3) + EQTERM(1 + (z - 1), 1 + z2) :|: z' >= 0, z - 1 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0, z4 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst[True][Ite](eqTerm(z', 1 + z23), z', z'', 1 + z23 + z32)) + SUBST(z', z'', 1 + z23 + z32) :|: z'' >= 0, z32 >= 0, z = 1, z4 = 1 + z2 + (1 + z23 + z32), z23 >= 0, z' >= 0, z2 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst[Ite](eqTerm(z', 1 + z24), z', z'', 1 + z24)) + SUBST(z', z'', 1 + z24) :|: z'' >= 0, z = 1, z' >= 0, z24 >= 0, z4 = 1 + z2 + (1 + z24), z2 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, mkapp(subst(z', z'', z22), subst(z', z'', z31))) + SUBST(z', z'', 1 + z22 + z31) :|: z'' >= 0, z31 >= 0, z4 = 1 + z2 + (1 + z22 + z31), z = 1, z' >= 0, z22 >= 0, z2 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 1 }-> 1 + 0 + SUBST(z', z'', z3) :|: z'' >= 0, z = 1, z' >= 0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z1' >= 0, 1 + z2 = 1 + z0', 0 = z1', z0' >= 0 eqTerm(z, z') -{ 0 }-> 1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1, z' - 1 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 eqTerm(z, z') -{ 0 }-> !EQ(z - 1, z' - 1) :|: z' - 1 >= 0, z - 1 >= 0 mkapp(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 mkapp(z, z') -{ 0 }-> 1 + z + z' :|: z' >= 0, z >= 0 mklam(z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 mklam(z, z') -{ 0 }-> 1 + (z - 1) + z' :|: z' >= 0, z - 1 >= 0 red(z) -{ 0 }-> red[Let](1 + z0 + z1, 0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red(z) -{ 0 }-> red[Let](1 + (1 + z016) + z1, 1 + z016) :|: z1 >= 0, z016 >= 0, z = 1 + (1 + z016) + z1 red(z) -{ 0 }-> red[Let](1 + (1 + z014 + z19) + z1, red[Let](1 + z014 + z19, red(z014))) :|: z1 >= 0, z19 >= 0, z = 1 + (1 + z014 + z19) + z1, z014 >= 0 red(z) -{ 0 }-> red[Let](1 + (1 + z015 + z110) + z1, 1 + z015 + z110) :|: z015 >= 0, z110 >= 0, z1 >= 0, z = 1 + (1 + z015 + z110) + z1 red(z) -{ 0 }-> 0 :|: z >= 0 red(z) -{ 0 }-> 1 + (z - 1) :|: z - 1 >= 0 red(z) -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + z1, z', 0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1, z' >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z019), z', 1 + z019) :|: z019 >= 0, z = 1 + z0 + (1 + z019), z0 >= 0, z' >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z017 + z111), z', red[Let](1 + z017 + z111, red(z017))) :|: z = 1 + z0 + (1 + z017 + z111), z0 >= 0, z111 >= 0, z017 >= 0, z' >= 0 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + (1 + z018 + z112), z', 1 + z018 + z112) :|: z = 1 + z0 + (1 + z018 + z112), z112 >= 0, z0 >= 0, z018 >= 0, z' >= 0 red[Let](z, z') -{ 0 }-> 0 :|: z >= 0, z' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(subst[True][Ite](eqTerm(1 + z1, 1 + z224), 1 + z1, z'', 1 + z224 + z316)) :|: z1 >= 0, z316 >= 0, z' = 1 + z1 + (1 + z224 + z316), z >= 0, z224 >= 0, z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(subst[Ite](eqTerm(1 + z1, 1 + z225), 1 + z1, z'', 1 + z225)) :|: z1 >= 0, z' = 1 + z1 + (1 + z225), z >= 0, z'' >= 0, z225 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(mkapp(subst(1 + z1, z'', z223), subst(1 + z1, z'', z315))) :|: z315 >= 0, z1 >= 0, z223 >= 0, z >= 0, z' = 1 + z1 + (1 + z223 + z315), z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> red(0) :|: z1 >= 0, z' = 1 + z1 + z2, z >= 0, z2 >= 0, z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + (z' - 1)) + z'' :|: z' - 1 >= 0, z >= 0, z'' >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1 + z2) + z'' :|: z1 >= 0, z' = 1 + z1 + z2, z >= 0, z2 >= 0, z'' >= 0 subst(z, z', z'') -{ 0 }-> z2' :|: z011 >= 0, z' >= 0, z = 1 + z011 + z17, z17 >= 0, z'' - 1 >= 0, 1 = 1, z0 >= 0, 1 + z011 + z17 = z0, z2' >= 0, 1 + (z'' - 1) = z2' subst(z, z', z'') -{ 0 }-> z2' :|: z18 >= 0, z' >= 0, z012 >= 0, z = 1 + z012 + z18, z'' - 1 >= 0, 1 = 1, z0 >= 0, 1 + z012 + z18 = z0, z2' >= 0, 1 + (z'' - 1) = z2' subst(z, z', z'') -{ 0 }-> subst[True][Ite](1, 1 + z08 + z15, z', 1 + z2 + z3) :|: z08 >= 0, z15 >= 0, z' >= 0, z = 1 + z08 + z15, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](1, 1 + z09 + z16, z', 1 + z2 + z3) :|: z' >= 0, z = 1 + z09 + z16, z16 >= 0, z09 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](0, z, z', 1 + z2 + z3) :|: z' >= 0, z >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](!EQ(z - 1, z2), 1 + (z - 1), z', 1 + z2 + z3) :|: z' >= 0, z'' = 1 + z2 + z3, z - 1 >= 0, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[Ite](!EQ(z - 1, z'' - 1), 1 + (z - 1), z', 1 + (z'' - 1)) :|: z' >= 0, z - 1 >= 0, z'' - 1 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + z26), z, z', 1 + z26 + z34), subst[True][Ite](eqTerm(z, 1 + z212), z, z', 1 + z212 + z38)) :|: z212 >= 0, z' >= 0, z'' = 1 + (1 + z26 + z34) + (1 + z212 + z38), z26 >= 0, z38 >= 0, z >= 0, z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + z26), z, z', 1 + z26 + z34), subst[Ite](eqTerm(z, 1 + z213), z, z', 1 + z213)) :|: z'' = 1 + (1 + z26 + z34) + (1 + z213), z' >= 0, z213 >= 0, z26 >= 0, z >= 0, z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + z26), z, z', 1 + z26 + z34), mkapp(subst(z, z', z211), subst(z, z', z37))) :|: z' >= 0, z26 >= 0, z211 >= 0, z37 >= 0, z >= 0, z'' = 1 + (1 + z26 + z34) + (1 + z211 + z37), z34 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[True][Ite](eqTerm(z, 1 + z26), z, z', 1 + z26 + z34), 0) :|: z' >= 0, z26 >= 0, z'' = 1 + (1 + z26 + z34) + z3, z >= 0, z34 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z, 1 + z27), z, z', 1 + z27), subst[True][Ite](eqTerm(z, 1 + z215), z, z', 1 + z215 + z310)) :|: z' >= 0, z'' = 1 + (1 + z27) + (1 + z215 + z310), z27 >= 0, z310 >= 0, z >= 0, z215 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z, 1 + z27), z, z', 1 + z27), subst[Ite](eqTerm(z, 1 + z216), z, z', 1 + z216)) :|: z216 >= 0, z' >= 0, z27 >= 0, z >= 0, z'' = 1 + (1 + z27) + (1 + z216) subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z, 1 + z27), z, z', 1 + z27), mkapp(subst(z, z', z214), subst(z, z', z39))) :|: z' >= 0, z39 >= 0, z27 >= 0, z214 >= 0, z >= 0, z'' = 1 + (1 + z27) + (1 + z214 + z39) subst(z, z', z'') -{ 0 }-> mkapp(subst[Ite](eqTerm(z, 1 + z27), z, z', 1 + z27), 0) :|: z'' = 1 + (1 + z27) + z3, z' >= 0, z27 >= 0, z >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z, z', z25), subst(z, z', z33)), subst[True][Ite](eqTerm(z, 1 + z29), z, z', 1 + z29 + z36)) :|: z25 >= 0, z' >= 0, z29 >= 0, z36 >= 0, z >= 0, z33 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z29 + z36) subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z, z', z25), subst(z, z', z33)), subst[Ite](eqTerm(z, 1 + z210), z, z', 1 + z210)) :|: z25 >= 0, z' >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z210), z210 >= 0, z >= 0, z33 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z, z', z25), subst(z, z', z33)), mkapp(subst(z, z', z28), subst(z, z', z35))) :|: z25 >= 0, z' >= 0, z35 >= 0, z28 >= 0, z'' = 1 + (1 + z25 + z33) + (1 + z28 + z35), z >= 0, z33 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(mkapp(subst(z, z', z25), subst(z, z', z33)), 0) :|: z25 >= 0, z' >= 0, z'' = 1 + (1 + z25 + z33) + z3, z >= 0, z33 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, subst[True][Ite](eqTerm(z, 1 + z218), z, z', 1 + z218 + z312)) :|: z' >= 0, z312 >= 0, z218 >= 0, z >= 0, z'' = 1 + z2 + (1 + z218 + z312), z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, subst[Ite](eqTerm(z, 1 + z219), z, z', 1 + z219)) :|: z' >= 0, z'' = 1 + z2 + (1 + z219), z219 >= 0, z >= 0, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(0, mkapp(subst(z, z', z217), subst(z, z', z311))) :|: z311 >= 0, z' >= 0, z'' = 1 + z2 + (1 + z217 + z311), z217 >= 0, z >= 0, z2 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z' >= 0, z >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0, v0 >= 0, v1 >= 0, 0 = v0, 0 = v1 subst(z, z', z'') -{ 0 }-> 0 :|: z011 >= 0, z' >= 0, z = 1 + z011 + z17, z17 >= 0, z'' - 1 >= 0, v0 >= 0, v1 >= 0, 1 = v0, 1 + z011 + z17 = v1, 1 + (z'' - 1) = v3, v3 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z18 >= 0, z' >= 0, z012 >= 0, z = 1 + z012 + z18, z'' - 1 >= 0, v0 >= 0, v1 >= 0, 1 = v0, 1 + z012 + z18 = v1, 1 + (z'' - 1) = v3, v3 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: z' >= 0, z >= 0, z'' - 1 >= 0, v0 >= 0, 0 = v0, 1 + (z'' - 1) = v3, v3 >= 0 subst(z, z', z'') -{ 0 }-> 1 + z0' + z1' :|: z' >= 0, z >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0, 0 = z0', z1' >= 0, 0 = z1', z0' >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> z'' :|: z = 2, z'' >= 0, z' >= 0, z4 >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> z4 :|: z'' >= 0, z = 1, z' >= 0, z4 >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0, z4 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> z4 :|: z = 2, z'' >= 0, z' >= 0, z4 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst[True][Ite](eqTerm(z', 1 + z221), z', z'', 1 + z221 + z314)) :|: z'' >= 0, z = 1, z221 >= 0, z' >= 0, z2 >= 0, z4 = 1 + z2 + (1 + z221 + z314), z314 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst[Ite](eqTerm(z', 1 + z222), z', z'', 1 + z222)) :|: z'' >= 0, z = 1, z222 >= 0, z4 = 1 + z2 + (1 + z222), z' >= 0, z2 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, mkapp(subst(z', z'', z220), subst(z', z'', z313))) :|: z'' >= 0, z = 1, z220 >= 0, z313 >= 0, z' >= 0, z4 = 1 + z2 + (1 + z220 + z313), z2 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 0 :|: z >= 0, z' >= 0, z'' >= 0, z4 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 0 :|: z'' >= 0, z = 1, z' >= 0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, v0 >= 0, v1 >= 0, 1 + z2 = v0, 0 = v1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 1 + z0' + z1' :|: z'' >= 0, z = 1, z' >= 0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z1' >= 0, 1 + z2 = 1 + z0', 0 = z1', z0' >= 0 ---------------------------------------- (61) CompletionProof (UPPER BOUND(ID)) The TRS is a completely defined constructor system, as every type has a constant constructor and the following rules were added: !EQ'(v0, v1) -> null_!EQ' [0] RED[LET][LET](v0, v1, v2) -> null_RED[LET][LET] [0] SUBST[TRUE][ITE](v0, v1, v2, v3) -> null_SUBST[TRUE][ITE] [0] RED[LET](v0, v1) -> null_RED[LET] [0] subst(v0, v1, v2) -> null_subst [0] mkapp(v0, v1) -> null_mkapp [0] subst[True][Ite](v0, v1, v2, v3) -> null_subst[True][Ite] [0] eqTerm(v0, v1) -> null_eqTerm [0] !EQ(v0, v1) -> null_!EQ [0] mklam(v0, v1) -> null_mklam [0] subst[Ite](v0, v1, v2, v3) -> null_subst[Ite] [0] red(v0) -> null_red [0] red[Let](v0, v1) -> null_red[Let] [0] red[Let][Let](v0, v1, v2) -> null_red[Let][Let] [0] SUBST(v0, v1, v2) -> null_SUBST [0] RED(v0) -> null_RED [0] EQTERM(v0, v1) -> null_EQTERM [0] MKLAM(v0, v1) -> null_MKLAM [0] And the following fresh constants: null_!EQ', null_RED[LET][LET], null_SUBST[TRUE][ITE], null_RED[LET], null_subst, null_mkapp, null_subst[True][Ite], null_eqTerm, null_!EQ, null_mklam, null_subst[Ite], null_red, null_red[Let], null_red[Let][Let], null_SUBST, null_RED, null_EQTERM, null_MKLAM ---------------------------------------- (62) Obligation: Runtime Complexity Weighted TRS where all functions are completely defined. The underlying TRS is: Runtime Complexity Weighted TRS with Types. The TRS R consists of the following rules: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) [1] RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) [1] RED(Lam(z0, z1)) -> c21 [1] RED(V(z0)) -> c22 [1] EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) [1] MKLAM(V(z0), z1) -> c34 [1] SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) [1] SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) [1] SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) [1] EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) [1] EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) [1] !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) [0] RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) [0] SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) [0] RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) [0] subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) [0] subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) [0] subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) [0] mkapp(z0, z1) -> App(z0, z1) [0] subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) [0] subst[True][Ite](True, z0, z1, z2) -> z2 [0] eqTerm(App(z0, z1), V(z2)) -> False [0] eqTerm(Lam(z0, z1), V(z2)) -> False [0] eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) [0] !EQ(S(z0), S(z1)) -> !EQ(z0, z1) [0] !EQ(0, S(z0)) -> False [0] !EQ(S(z0), 0) -> False [0] !EQ(0, 0) -> True [0] mklam(V(z0), z1) -> Lam(z0, z1) [0] subst[Ite](False, z0, z1, z2) -> z2 [0] subst[Ite](True, z0, z1, z2) -> z1 [0] red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) [0] red(Lam(z0, z1)) -> Lam(z0, z1) [0] red(V(z0)) -> V(z0) [0] red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) [0] red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) [0] red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) [0] red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) [0] !EQ'(v0, v1) -> null_!EQ' [0] RED[LET][LET](v0, v1, v2) -> null_RED[LET][LET] [0] SUBST[TRUE][ITE](v0, v1, v2, v3) -> null_SUBST[TRUE][ITE] [0] RED[LET](v0, v1) -> null_RED[LET] [0] subst(v0, v1, v2) -> null_subst [0] mkapp(v0, v1) -> null_mkapp [0] subst[True][Ite](v0, v1, v2, v3) -> null_subst[True][Ite] [0] eqTerm(v0, v1) -> null_eqTerm [0] !EQ(v0, v1) -> null_!EQ [0] mklam(v0, v1) -> null_mklam [0] subst[Ite](v0, v1, v2, v3) -> null_subst[Ite] [0] red(v0) -> null_red [0] red[Let](v0, v1) -> null_red[Let] [0] red[Let][Let](v0, v1, v2) -> null_red[Let][Let] [0] SUBST(v0, v1, v2) -> null_SUBST [0] RED(v0) -> null_RED [0] EQTERM(v0, v1) -> null_EQTERM [0] MKLAM(v0, v1) -> null_MKLAM [0] The TRS has the following type information: SUBST :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c18:c16:c17:c19:null_SUBST Lam :: S:0 -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] c18 :: c11:null_SUBST[TRUE][ITE] -> c33:c23:c24:c28:c29:null_EQTERM -> c18:c16:c17:c19:null_SUBST SUBST[TRUE][ITE] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c11:null_SUBST[TRUE][ITE] eqTerm :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> False:True:null_eqTerm:null_!EQ V :: S:0 -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] EQTERM :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c33:c23:c24:c28:c29:null_EQTERM RED :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c20:c21:c22:null_RED App :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] c20 :: c13:null_RED[LET] -> c20:c21:c22:null_RED -> c20:c21:c22:null_RED RED[LET] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c13:null_RED[LET] red :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] c21 :: c20:c21:c22:null_RED c22 :: c20:c21:c22:null_RED c33 :: c4:null_!EQ' -> c33:c23:c24:c28:c29:null_EQTERM !EQ' :: S:0 -> S:0 -> c4:null_!EQ' MKLAM :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c34:null_MKLAM c34 :: c34:null_MKLAM c16 :: c18:c16:c17:c19:null_SUBST -> c18:c16:c17:c19:null_SUBST c17 :: c18:c16:c17:c19:null_SUBST -> c18:c16:c17:c19:null_SUBST c19 :: c33:c23:c24:c28:c29:null_EQTERM -> c18:c16:c17:c19:null_SUBST c23 :: c33:c23:c24:c28:c29:null_EQTERM -> c33:c23:c24:c28:c29:null_EQTERM c24 :: c33:c23:c24:c28:c29:null_EQTERM -> c33:c23:c24:c28:c29:null_EQTERM c28 :: c4:null_!EQ' -> c33:c23:c24:c28:c29:null_EQTERM c29 :: c33:c23:c24:c28:c29:null_EQTERM -> c33:c23:c24:c28:c29:null_EQTERM S :: S:0 -> S:0 c4 :: c4:null_!EQ' -> c4:null_!EQ' RED[LET][LET] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> c8:null_RED[LET][LET] c8 :: c20:c21:c22:null_RED -> c18:c16:c17:c19:null_SUBST -> c8:null_RED[LET][LET] subst :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] False :: False:True:null_eqTerm:null_!EQ c11 :: c34:null_MKLAM -> c18:c16:c17:c19:null_SUBST -> c11:null_SUBST[TRUE][ITE] c13 :: c8:null_RED[LET][LET] -> c20:c21:c22:null_RED -> c13:null_RED[LET] mkapp :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] subst[True][Ite] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] subst[Ite] :: False:True:null_eqTerm:null_!EQ -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] mklam :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] True :: False:True:null_eqTerm:null_!EQ !EQ :: S:0 -> S:0 -> False:True:null_eqTerm:null_!EQ 0 :: S:0 red[Let] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] red[Let][Let] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] -> Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_!EQ' :: c4:null_!EQ' null_RED[LET][LET] :: c8:null_RED[LET][LET] null_SUBST[TRUE][ITE] :: c11:null_SUBST[TRUE][ITE] null_RED[LET] :: c13:null_RED[LET] null_subst :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_mkapp :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_subst[True][Ite] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_eqTerm :: False:True:null_eqTerm:null_!EQ null_!EQ :: False:True:null_eqTerm:null_!EQ null_mklam :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_subst[Ite] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_red :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_red[Let] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_red[Let][Let] :: Lam:V:App:null_subst:null_mkapp:null_subst[True][Ite]:null_mklam:null_subst[Ite]:null_red:null_red[Let]:null_red[Let][Let] null_SUBST :: c18:c16:c17:c19:null_SUBST null_RED :: c20:c21:c22:null_RED null_EQTERM :: c33:c23:c24:c28:c29:null_EQTERM null_MKLAM :: c34:null_MKLAM Rewrite Strategy: INNERMOST ---------------------------------------- (63) CpxTypedWeightedTrsToRntsProof (UPPER BOUND(ID)) Transformed the TRS into an over-approximating RNTS by (improved) Size Abstraction. The constant constructors are abstracted as follows: c21 => 0 c22 => 1 c34 => 1 False => 1 True => 2 0 => 0 null_!EQ' => 0 null_RED[LET][LET] => 0 null_SUBST[TRUE][ITE] => 0 null_RED[LET] => 0 null_subst => 0 null_mkapp => 0 null_subst[True][Ite] => 0 null_eqTerm => 0 null_!EQ => 0 null_mklam => 0 null_subst[Ite] => 0 null_red => 0 null_red[Let] => 0 null_red[Let][Let] => 0 null_SUBST => 0 null_RED => 0 null_EQTERM => 0 null_MKLAM => 0 ---------------------------------------- (64) Obligation: Complexity RNTS consisting of the following rules: !EQ(z, z') -{ 0 }-> 2 :|: z = 0, z' = 0 !EQ(z, z') -{ 0 }-> 1 :|: z0 >= 0, z' = 1 + z0, z = 0 !EQ(z, z') -{ 0 }-> 1 :|: z = 1 + z0, z0 >= 0, z' = 0 !EQ(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ(z, z') -{ 0 }-> !EQ(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 !EQ'(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 !EQ'(z, z') -{ 0 }-> 1 + !EQ'(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 EQTERM(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + EQTERM(z1, z3) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 EQTERM(z, z') -{ 1 }-> 1 + !EQ'(z0, z2) :|: z1 >= 0, z' = 1 + z2 + z3, z0 >= 0, z = 1 + z0 + z1, z2 >= 0, z3 >= 0 MKLAM(z, z') -{ 1 }-> 1 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 MKLAM(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 RED(z) -{ 1 }-> 1 :|: z = 1 + z0, z0 >= 0 RED(z) -{ 1 }-> 0 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 RED(z) -{ 1 }-> 1 + RED[LET](1 + z0 + z1, red(z0)) + RED(z0) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 RED[LET](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 RED[LET](z, z') -{ 0 }-> 1 + RED[LET][LET](1 + z0 + z1, z2, red(z1)) + RED(z1) :|: z1 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + z1, z2 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 RED[LET][LET](z, z', z'') -{ 0 }-> 1 + RED(subst(1 + z1, z3, z2)) + SUBST(1 + z1, z3, z2) :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z0, z1, z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST(z0, z1, z3) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + EQTERM(z0, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2, z2 >= 0 SUBST(z, z', z'') -{ 1 }-> 1 + SUBST[TRUE][ITE](eqTerm(z0, 1 + z2), z0, z1, 1 + z2 + z3) + EQTERM(z0, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 SUBST[TRUE][ITE](z, z', z'', z4) -{ 0 }-> 1 + MKLAM(1 + z2, subst(z0, z1, z3)) + SUBST(z0, z1, z3) :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1 eqTerm(z, z') -{ 0 }-> 1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1, z' = 1 + z2, z2 >= 0 eqTerm(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 eqTerm(z, z') -{ 0 }-> !EQ(z0, z1) :|: z1 >= 0, z = 1 + z0, z0 >= 0, z' = 1 + z1 mkapp(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mkapp(z, z') -{ 0 }-> 1 + z0 + z1 :|: z = z0, z1 >= 0, z' = z1, z0 >= 0 mklam(z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 mklam(z, z') -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z = 1 + z0, z' = z1, z0 >= 0 red(z) -{ 0 }-> red[Let](1 + z0 + z1, red(z0)) :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red(z) -{ 0 }-> 0 :|: v0 >= 0, z = v0 red(z) -{ 0 }-> 1 + z0 :|: z = 1 + z0, z0 >= 0 red(z) -{ 0 }-> 1 + z0 + z1 :|: z1 >= 0, z0 >= 0, z = 1 + z0 + z1 red[Let](z, z') -{ 0 }-> red[Let][Let](1 + z0 + z1, z2, red(z1)) :|: z1 >= 0, z' = z2, z0 >= 0, z = 1 + z0 + z1, z2 >= 0 red[Let](z, z') -{ 0 }-> 0 :|: v0 >= 0, v1 >= 0, z = v0, z' = v1 red[Let][Let](z, z', z'') -{ 0 }-> red(subst(1 + z1, z3, z2)) :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1) + z2 :|: z'' = z2, z = z0, z1 >= 0, z0 >= 0, z' = 1 + z1, z2 >= 0 red[Let][Let](z, z', z'') -{ 0 }-> 1 + (1 + z1 + z2) + z3 :|: z = z0, z1 >= 0, z' = 1 + z1 + z2, z0 >= 0, z'' = z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[True][Ite](eqTerm(z0, 1 + z2), z0, z1, 1 + z2 + z3) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> subst[Ite](eqTerm(z0, 1 + z2), z0, z1, 1 + z2) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2, z2 >= 0 subst(z, z', z'') -{ 0 }-> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) :|: z = z0, z1 >= 0, z' = z1, z0 >= 0, z'' = 1 + z2 + z3, z2 >= 0, z3 >= 0 subst(z, z', z'') -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, v2 >= 0 subst[Ite](z, z', z'', z4) -{ 0 }-> z1 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 subst[True][Ite](z, z', z'', z4) -{ 0 }-> z2 :|: z = 2, z1 >= 0, z0 >= 0, z' = z0, z2 >= 0, z'' = z1, z4 = z2 subst[True][Ite](z, z', z'', z4) -{ 0 }-> mklam(1 + z2, subst(z0, z1, z3)) :|: z1 >= 0, z = 1, z0 >= 0, z' = z0, z4 = 1 + z2 + z3, z2 >= 0, z3 >= 0, z'' = z1 subst[True][Ite](z, z', z'', z4) -{ 0 }-> 0 :|: v0 >= 0, z'' = v2, v1 >= 0, z = v0, z' = v1, z4 = v3, v2 >= 0, v3 >= 0 Only complete derivations are relevant for the runtime complexity. ---------------------------------------- (65) CdtRuleRemovalProof (UPPER BOUND(ADD(n^1))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) We considered the (Usable) Rules:none And the Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) The order we found is given by the following interpretation: Polynomial interpretation : POL(!EQ(x_1, x_2)) = [1] + x_1 + x_2 POL(!EQ'(x_1, x_2)) = 0 POL(0) = [1] POL(App(x_1, x_2)) = x_1 + x_2 POL(EQTERM(x_1, x_2)) = x_2 POL(False) = [1] POL(Lam(x_1, x_2)) = [1] + x_2 POL(MKLAM(x_1, x_2)) = x_1 POL(RED(x_1)) = 0 POL(RED[LET](x_1, x_2)) = 0 POL(RED[LET][LET](x_1, x_2, x_3)) = 0 POL(S(x_1)) = [1] + x_1 POL(SUBST(x_1, x_2, x_3)) = x_1 POL(SUBST[TRUE][ITE](x_1, x_2, x_3, x_4)) = x_2 POL(True) = [1] POL(V(x_1)) = 0 POL(c11(x_1, x_2)) = x_1 + x_2 POL(c13(x_1, x_2)) = x_1 + x_2 POL(c16(x_1)) = x_1 POL(c17(x_1)) = x_1 POL(c18(x_1, x_2)) = x_1 + x_2 POL(c19(x_1)) = x_1 POL(c20(x_1, x_2)) = x_1 + x_2 POL(c21) = 0 POL(c22) = 0 POL(c23(x_1)) = x_1 POL(c24(x_1)) = x_1 POL(c28(x_1)) = x_1 POL(c29(x_1)) = x_1 POL(c33(x_1)) = x_1 POL(c34) = 0 POL(c4(x_1)) = x_1 POL(c8(x_1, x_2)) = x_1 + x_2 POL(eqTerm(x_1, x_2)) = [1] + x_1 + x_2 POL(mkapp(x_1, x_2)) = [1] + x_1 + x_2 POL(mklam(x_1, x_2)) = [1] + x_1 + x_2 POL(red(x_1)) = [1] POL(red[Let](x_1, x_2)) = [1] + x_1 + x_2 POL(red[Let][Let](x_1, x_2, x_3)) = [1] + x_1 + x_2 POL(subst(x_1, x_2, x_3)) = [1] + x_1 + x_2 + x_3 POL(subst[Ite](x_1, x_2, x_3, x_4)) = [1] + x_1 + x_2 + x_3 + x_4 POL(subst[True][Ite](x_1, x_2, x_3, x_4)) = [1] + x_2 + x_3 + x_4 ---------------------------------------- (66) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) S tuples: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST_3, RED_1, EQTERM_2, MKLAM_2 Compound Symbols: c4_1, c8_2, c11_2, c13_2, c18_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (67) CdtRuleRemovalProof (UPPER BOUND(ADD(n^1))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) We considered the (Usable) Rules:none And the Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) The order we found is given by the following interpretation: Polynomial interpretation : POL(!EQ(x_1, x_2)) = [1] + x_1 + x_2 POL(!EQ'(x_1, x_2)) = 0 POL(0) = [1] POL(App(x_1, x_2)) = [1] + x_1 + x_2 POL(EQTERM(x_1, x_2)) = x_2 POL(False) = [1] POL(Lam(x_1, x_2)) = x_2 POL(MKLAM(x_1, x_2)) = x_1 POL(RED(x_1)) = 0 POL(RED[LET](x_1, x_2)) = 0 POL(RED[LET][LET](x_1, x_2, x_3)) = 0 POL(S(x_1)) = [1] + x_1 POL(SUBST(x_1, x_2, x_3)) = x_1 POL(SUBST[TRUE][ITE](x_1, x_2, x_3, x_4)) = x_2 POL(True) = [1] POL(V(x_1)) = 0 POL(c11(x_1, x_2)) = x_1 + x_2 POL(c13(x_1, x_2)) = x_1 + x_2 POL(c16(x_1)) = x_1 POL(c17(x_1)) = x_1 POL(c18(x_1, x_2)) = x_1 + x_2 POL(c19(x_1)) = x_1 POL(c20(x_1, x_2)) = x_1 + x_2 POL(c21) = 0 POL(c22) = 0 POL(c23(x_1)) = x_1 POL(c24(x_1)) = x_1 POL(c28(x_1)) = x_1 POL(c29(x_1)) = x_1 POL(c33(x_1)) = x_1 POL(c34) = 0 POL(c4(x_1)) = x_1 POL(c8(x_1, x_2)) = x_1 + x_2 POL(eqTerm(x_1, x_2)) = [1] + x_1 + x_2 POL(mkapp(x_1, x_2)) = [1] + x_1 + x_2 POL(mklam(x_1, x_2)) = [1] + x_1 + x_2 POL(red(x_1)) = [1] POL(red[Let](x_1, x_2)) = [1] + x_1 + x_2 POL(red[Let][Let](x_1, x_2, x_3)) = [1] + x_1 + x_2 POL(subst(x_1, x_2, x_3)) = [1] + x_1 + x_2 + x_3 POL(subst[Ite](x_1, x_2, x_3, x_4)) = [1] + x_1 + x_2 + x_3 + x_4 POL(subst[True][Ite](x_1, x_2, x_3, x_4)) = [1] + x_2 + x_3 + x_4 ---------------------------------------- (68) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) S tuples: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET][LET]_3, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST_3, RED_1, EQTERM_2, MKLAM_2 Compound Symbols: c4_1, c8_2, c11_2, c13_2, c18_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (69) CdtNarrowingProof (BOTH BOUNDS(ID, ID)) Use narrowing to replace RED[LET][LET](z0, Lam(z1, z2), z3) -> c8(RED(subst(V(z1), z3, z2)), SUBST(V(z1), z3, z2)) by RED[LET][LET](x0, Lam(x1, App(z2, z3)), z1) -> c8(RED(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3))), SUBST(V(x1), z1, App(z2, z3))) RED[LET][LET](x0, Lam(x1, Lam(z2, z3)), z1) -> c8(RED(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3))), SUBST(V(x1), z1, Lam(z2, z3))) RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) ---------------------------------------- (70) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) RED[LET][LET](x0, Lam(x1, App(z2, z3)), z1) -> c8(RED(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3))), SUBST(V(x1), z1, App(z2, z3))) RED[LET][LET](x0, Lam(x1, Lam(z2, z3)), z1) -> c8(RED(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3))), SUBST(V(x1), z1, Lam(z2, z3))) RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) S tuples: SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, SUBST_3, RED_1, EQTERM_2, MKLAM_2, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c18_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_2 ---------------------------------------- (71) CdtNarrowingProof (BOTH BOUNDS(ID, ID)) Use narrowing to replace SUBST(z0, z1, Lam(z2, z3)) -> c18(SUBST[TRUE][ITE](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)), EQTERM(z0, V(z2))) by SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3)), EQTERM(App(z0, z1), V(z2))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3)), EQTERM(Lam(z0, z1), V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) ---------------------------------------- (72) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) RED[LET][LET](x0, Lam(x1, App(z2, z3)), z1) -> c8(RED(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3))), SUBST(V(x1), z1, App(z2, z3))) RED[LET][LET](x0, Lam(x1, Lam(z2, z3)), z1) -> c8(RED(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3))), SUBST(V(x1), z1, Lam(z2, z3))) RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3)), EQTERM(App(z0, z1), V(z2))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3)), EQTERM(Lam(z0, z1), V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3)), EQTERM(App(z0, z1), V(z2))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3)), EQTERM(Lam(z0, z1), V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_2, c18_2 ---------------------------------------- (73) CdtRhsSimplificationProcessorProof (BOTH BOUNDS(ID, ID)) Removed 2 trailing tuple parts ---------------------------------------- (74) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) RED[LET][LET](x0, Lam(x1, App(z2, z3)), z1) -> c8(RED(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3))), SUBST(V(x1), z1, App(z2, z3))) RED[LET][LET](x0, Lam(x1, Lam(z2, z3)), z1) -> c8(RED(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3))), SUBST(V(x1), z1, Lam(z2, z3))) RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_2, c18_2, c18_1 ---------------------------------------- (75) CdtNarrowingProof (BOTH BOUNDS(ID, ID)) Use narrowing to replace RED[LET][LET](x0, Lam(x1, App(z2, z3)), z1) -> c8(RED(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3))), SUBST(V(x1), z1, App(z2, z3))) by RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) ---------------------------------------- (76) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) RED[LET][LET](x0, Lam(x1, Lam(z2, z3)), z1) -> c8(RED(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3))), SUBST(V(x1), z1, Lam(z2, z3))) RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_2, c18_2, c18_1, c8_1 ---------------------------------------- (77) CdtNarrowingProof (BOTH BOUNDS(ID, ID)) Use narrowing to replace RED[LET][LET](x0, Lam(x1, Lam(z2, z3)), z1) -> c8(RED(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3))), SUBST(V(x1), z1, Lam(z2, z3))) by RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) ---------------------------------------- (78) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_2, c18_2, c18_1, c8_1 ---------------------------------------- (79) CdtNarrowingProof (BOTH BOUNDS(ID, ID)) Use narrowing to replace RED[LET][LET](x0, Lam(x1, V(z2)), z1) -> c8(RED(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2))), SUBST(V(x1), z1, V(z2))) by RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) ---------------------------------------- (80) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_2, c18_1, c8_2, c8_1 ---------------------------------------- (81) CdtNarrowingProof (BOTH BOUNDS(ID, ID)) Use narrowing to replace SUBST(V(z0), x1, Lam(z1, x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(z0), x1, Lam(z1, x3)), EQTERM(V(z0), V(z1))) by SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(0), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](True, V(0), x1, Lam(0, x3)), EQTERM(V(0), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) ---------------------------------------- (82) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(0), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](True, V(0), x1, Lam(0, x3)), EQTERM(V(0), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(0), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](True, V(0), x1, Lam(0, x3)), EQTERM(V(0), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2 ---------------------------------------- (83) CdtRhsSimplificationProcessorProof (BOTH BOUNDS(ID, ID)) Removed 1 trailing tuple parts ---------------------------------------- (84) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, SUBST[TRUE][ITE]_4, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3 Compound Symbols: c4_1, c11_2, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2 ---------------------------------------- (85) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace SUBST[TRUE][ITE](False, z0, z1, Lam(z2, z3)) -> c11(MKLAM(V(z2), subst(z0, z1, z3)), SUBST(z0, z1, z3)) by SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) ---------------------------------------- (86) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (87) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](x0, Lam(x1, App(x2, App(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)))), SUBST(V(x1), z1, App(x2, App(z2, z3)))) by RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) ---------------------------------------- (88) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (89) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](x0, Lam(x1, App(x2, Lam(z2, z3))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)))), SUBST(V(x1), z1, App(x2, Lam(z2, z3)))) by RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) ---------------------------------------- (90) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (91) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](x0, Lam(x1, App(x2, V(z2))), z1) -> c8(RED(mkapp(subst(V(x1), z1, x2), subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)))), SUBST(V(x1), z1, App(x2, V(z2)))) by RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) ---------------------------------------- (92) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (93) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](x0, Lam(x1, App(App(z2, z3), x3)), z1) -> c8(RED(mkapp(mkapp(subst(V(x1), z1, z2), subst(V(x1), z1, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(App(z2, z3), x3))) by RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) ---------------------------------------- (94) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (95) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(RED(App(subst(V(x1), x4, x2), subst(V(x1), x4, x3))), SUBST(V(x1), x4, App(x2, x3))) by RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) ---------------------------------------- (96) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (97) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(x1, App(Lam(z2, z3), x3)), z1) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(x1), V(z2)), V(x1), z1, Lam(z2, z3)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(Lam(z2, z3), x3))) by RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) ---------------------------------------- (98) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (99) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(x1, App(V(z2), x3)), z1) -> c8(RED(mkapp(subst[Ite](eqTerm(V(x1), V(z2)), V(x1), z1, V(z2)), subst(V(x1), z1, x3))), SUBST(V(x1), z1, App(V(z2), x3))) by RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) ---------------------------------------- (100) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_1, c8_2, c18_2, c11_2 ---------------------------------------- (101) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(x1, App(x2, x3)), x4) -> c8(SUBST(V(x1), x4, App(x2, x3))) by RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) ---------------------------------------- (102) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (103) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(z0, Lam(z1, x3)), x4) -> c8(RED(subst[True][Ite](!EQ(z0, z1), V(z0), x4, Lam(z1, x3))), SUBST(V(z0), x4, Lam(z1, x3))) by RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) ---------------------------------------- (104) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_2, c8_1, c18_2, c11_2 ---------------------------------------- (105) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(z0, V(z1)), x3) -> c8(RED(subst[Ite](!EQ(z0, z1), V(z0), x3, V(z1))), SUBST(V(z0), x3, V(z1))) by RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) ---------------------------------------- (106) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, RED[LET][LET]_3, SUBST[TRUE][ITE]_4 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c8_1, c18_2, c11_2, c8_2 ---------------------------------------- (107) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](x0, Lam(x1, V(x2)), x3) -> c8(SUBST(V(x1), x3, V(x2))) by RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) ---------------------------------------- (108) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1 ---------------------------------------- (109) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](z0, Lam(z1, App(z2, App(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), mkapp(subst(V(z1), z5, z3), subst(V(z1), z5, z4)))), SUBST(V(z1), z5, App(z2, App(z3, z4)))) by RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) ---------------------------------------- (110) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1 ---------------------------------------- (111) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](z0, Lam(z1, App(z2, Lam(z3, z4))), z5) -> c8(RED(App(subst(V(z1), z5, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), z5, Lam(z3, z4)))), SUBST(V(z1), z5, App(z2, Lam(z3, z4)))) by RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) ---------------------------------------- (112) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: !EQ'_2, RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3 Compound Symbols: c4_1, c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1 ---------------------------------------- (113) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace !EQ'(S(z0), S(z1)) -> c4(!EQ'(z0, z1)) by !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) ---------------------------------------- (114) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1 ---------------------------------------- (115) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](z0, Lam(z1, App(z2, V(z3))), z4) -> c8(RED(App(subst(V(z1), z4, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), z4, V(z3)))), SUBST(V(z1), z4, App(z2, V(z3)))) by RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) ---------------------------------------- (116) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1 ---------------------------------------- (117) CdtInstantiationProof (BOTH BOUNDS(ID, ID)) Use instantiation to replace RED[LET][LET](z0, Lam(z1, App(App(z2, z3), z4)), z5) -> c8(RED(App(mkapp(subst(V(z1), z5, z2), subst(V(z1), z5, z3)), subst(V(z1), z5, z4))), SUBST(V(z1), z5, App(App(z2, z3), z4))) by RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) ---------------------------------------- (118) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, EQTERM_2, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c33_1, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1 ---------------------------------------- (119) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace EQTERM(V(z0), V(z1)) -> c33(!EQ'(z0, z1)) by EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) ---------------------------------------- (120) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3)), EQTERM(V(0), V(S(z0)))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3)), EQTERM(V(S(z0)), V(0))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST(V(0), x1, Lam(0, x3)) -> c18(EQTERM(V(0), V(0))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, EQTERM_2, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1 ---------------------------------------- (121) CdtRhsSimplificationProcessorProof (BOTH BOUNDS(ID, ID)) Removed 3 trailing tuple parts ---------------------------------------- (122) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, EQTERM_2, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18 ---------------------------------------- (123) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace SUBST(z0, z1, App(z2, z3)) -> c16(SUBST(z0, z1, z2)) by SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) ---------------------------------------- (124) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, EQTERM_2, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1 ---------------------------------------- (125) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace SUBST(z0, z1, App(z2, z3)) -> c17(SUBST(z0, z1, z3)) by SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) ---------------------------------------- (126) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, EQTERM_2, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1 ---------------------------------------- (127) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(x0, x1), Lam(z1, App(Lam(z2, z3), z4)), y0) -> c8(RED(mkapp(subst[True][Ite](eqTerm(V(z1), V(z2)), V(z1), y0, Lam(z2, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(Lam(z2, z3), z4))) by RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) ---------------------------------------- (128) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, EQTERM_2, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c19_1, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1 ---------------------------------------- (129) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace SUBST(z0, z1, V(z2)) -> c19(EQTERM(z0, V(z2))) by SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) ---------------------------------------- (130) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, EQTERM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1 ---------------------------------------- (131) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(x0, x1), Lam(z1, App(V(z2), z3)), y0) -> c8(RED(mkapp(subst[Ite](eqTerm(V(z1), V(z2)), V(z1), y0, V(z2)), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(V(z2), z3))) by RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) ---------------------------------------- (132) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, EQTERM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c23_1, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1 ---------------------------------------- (133) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace EQTERM(App(z0, z1), App(z2, z3)) -> c23(EQTERM(z0, z2)) by EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) ---------------------------------------- (134) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, EQTERM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c24_1, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1 ---------------------------------------- (135) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace EQTERM(App(z0, z1), App(z2, z3)) -> c24(EQTERM(z1, z3)) by EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) ---------------------------------------- (136) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, EQTERM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1 ---------------------------------------- (137) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(x0, x1), Lam(z1, App(z2, App(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), mkapp(subst(V(z1), y0, z3), subst(V(z1), y0, z4)))), SUBST(V(z1), y0, App(z2, App(z3, z4)))) by RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) ---------------------------------------- (138) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, EQTERM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c28_1, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1 ---------------------------------------- (139) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c28(!EQ'(z0, z2)) by EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) ---------------------------------------- (140) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, EQTERM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c29_1, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1 ---------------------------------------- (141) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace EQTERM(Lam(z0, z1), Lam(z2, z3)) -> c29(EQTERM(z1, z3)) by EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) ---------------------------------------- (142) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (143) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace SUBST(V(x0), x1, Lam(x2, x3)) -> c18(EQTERM(V(x0), V(x2))) by SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) ---------------------------------------- (144) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (145) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(x0, x1), Lam(z1, App(z2, Lam(z3, z4))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[True][Ite](eqTerm(V(z1), V(z3)), V(z1), y0, Lam(z3, z4)))), SUBST(V(z1), y0, App(z2, Lam(z3, z4)))) by RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) ---------------------------------------- (146) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (147) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(x0, x1), Lam(z1, App(z2, V(z3))), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst[Ite](eqTerm(V(z1), V(z3)), V(z1), y0, V(z3)))), SUBST(V(z1), y0, App(z2, V(z3)))) by RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) ---------------------------------------- (148) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (149) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(x0, x1), Lam(z1, App(App(z2, z3), z4)), y0) -> c8(RED(App(mkapp(subst(V(z1), y0, z2), subst(V(z1), y0, z3)), subst(V(z1), y0, z4))), SUBST(V(z1), y0, App(App(z2, z3), z4))) by RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) ---------------------------------------- (150) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (151) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](eqTerm(V(z2), V(z3)), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) by RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) ---------------------------------------- (152) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (153) CdtRewritingProof (BOTH BOUNDS(ID, ID)) Used rewriting to replace RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](eqTerm(V(z2), V(z3)), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) by RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) ---------------------------------------- (154) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (155) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(SUBST(V(z1), y0, App(z2, z3))) by RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) ---------------------------------------- (156) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c8_1, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1 ---------------------------------------- (157) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(SUBST(V(z1), y0, V(z2))) by RED[LET][LET](App(z0, z1), Lam(S(S(y0)), V(S(S(y2)))), z4) -> c8(SUBST(V(S(S(y0))), z4, V(S(S(y2))))) ---------------------------------------- (158) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(S(y0)), V(S(S(y2)))), z4) -> c8(SUBST(V(S(S(y0))), z4, V(S(S(y2))))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, !EQ'_2, EQTERM_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c4_1, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_1 ---------------------------------------- (159) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace !EQ'(S(S(y0)), S(S(y1))) -> c4(!EQ'(S(y0), S(y1))) by !EQ'(S(S(S(y0))), S(S(S(y1)))) -> c4(!EQ'(S(S(y0)), S(S(y1)))) ---------------------------------------- (160) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(S(y0)), V(S(S(y2)))), z4) -> c8(SUBST(V(S(S(y0))), z4, V(S(S(y2))))) !EQ'(S(S(S(y0))), S(S(S(y1)))) -> c4(!EQ'(S(S(y0)), S(S(y1)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, EQTERM_2, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c33_1, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_1, c4_1 ---------------------------------------- (161) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace EQTERM(V(S(S(y0))), V(S(S(y1)))) -> c33(!EQ'(S(S(y0)), S(S(y1)))) by EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) ---------------------------------------- (162) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(S(y0)), V(S(S(y2)))), z4) -> c8(SUBST(V(S(S(y0))), z4, V(S(S(y2))))) !EQ'(S(S(S(y0))), S(S(S(y1)))) -> c4(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, EQTERM_2, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_1, c4_1, c33_1 ---------------------------------------- (163) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace SUBST(z0, z1, App(App(y2, y3), z3)) -> c16(SUBST(z0, z1, App(y2, y3))) by SUBST(z0, z1, App(App(App(y2, y3), z3), z4)) -> c16(SUBST(z0, z1, App(App(y2, y3), z3))) SUBST(z0, z1, App(App(V(y2), z3), z4)) -> c16(SUBST(z0, z1, App(V(y2), z3))) SUBST(App(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(Lam(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(V(S(y0)), z1, App(App(Lam(S(y2), y3), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3))) SUBST(V(y0), z1, App(App(Lam(y2, y3), z3), z4)) -> c16(SUBST(V(y0), z1, App(Lam(y2, y3), z3))) SUBST(V(0), z1, App(App(Lam(S(y1), y2), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(S(y1), y2), z3))) SUBST(V(S(y0)), z1, App(App(Lam(0, y2), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(0, y2), z3))) SUBST(V(0), z1, App(App(Lam(0, y1), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(0, y1), z3))) SUBST(z0, z1, App(App(z2, App(y3, y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(y3, y4)))) SUBST(z0, z1, App(App(z2, V(y3)), z4)) -> c16(SUBST(z0, z1, App(z2, V(y3)))) SUBST(App(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(Lam(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(S(y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(S(y3), y4)))) SUBST(V(y0), z1, App(App(z2, Lam(y3, y4)), z4)) -> c16(SUBST(V(y0), z1, App(z2, Lam(y3, y4)))) SUBST(V(0), z1, App(App(z2, Lam(S(y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(S(y2), y3)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(0, y3)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(0, y3)))) SUBST(V(0), z1, App(App(z2, Lam(0, y2)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(0, y2)))) SUBST(z0, z1, App(App(z2, App(App(y3, y4), y5)), z4)) -> c16(SUBST(z0, z1, App(z2, App(App(y3, y4), y5)))) SUBST(z0, z1, App(App(z2, App(V(y3), y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(V(y3), y4)))) SUBST(App(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(Lam(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(S(y3), y4), y5)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y3), y4), y5)))) SUBST(V(y0), z1, App(App(z2, App(Lam(y3, y4), y5)), z4)) -> c16(SUBST(V(y0), z1, App(z2, App(Lam(y3, y4), y5)))) SUBST(V(0), z1, App(App(z2, App(Lam(S(y2), y3), y4)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(S(y2), y3), y4)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(0, y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y3), y4)))) SUBST(V(0), z1, App(App(z2, App(Lam(0, y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(0, y2), y3)))) ---------------------------------------- (164) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(S(y0)), V(S(S(y2)))), z4) -> c8(SUBST(V(S(S(y0))), z4, V(S(S(y2))))) !EQ'(S(S(S(y0))), S(S(S(y1)))) -> c4(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) SUBST(z0, z1, App(App(App(y2, y3), z3), z4)) -> c16(SUBST(z0, z1, App(App(y2, y3), z3))) SUBST(z0, z1, App(App(V(y2), z3), z4)) -> c16(SUBST(z0, z1, App(V(y2), z3))) SUBST(App(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(Lam(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(V(S(y0)), z1, App(App(Lam(S(y2), y3), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3))) SUBST(V(y0), z1, App(App(Lam(y2, y3), z3), z4)) -> c16(SUBST(V(y0), z1, App(Lam(y2, y3), z3))) SUBST(V(0), z1, App(App(Lam(S(y1), y2), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(S(y1), y2), z3))) SUBST(V(S(y0)), z1, App(App(Lam(0, y2), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(0, y2), z3))) SUBST(V(0), z1, App(App(Lam(0, y1), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(0, y1), z3))) SUBST(z0, z1, App(App(z2, App(y3, y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(y3, y4)))) SUBST(z0, z1, App(App(z2, V(y3)), z4)) -> c16(SUBST(z0, z1, App(z2, V(y3)))) SUBST(App(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(Lam(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(S(y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(S(y3), y4)))) SUBST(V(y0), z1, App(App(z2, Lam(y3, y4)), z4)) -> c16(SUBST(V(y0), z1, App(z2, Lam(y3, y4)))) SUBST(V(0), z1, App(App(z2, Lam(S(y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(S(y2), y3)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(0, y3)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(0, y3)))) SUBST(V(0), z1, App(App(z2, Lam(0, y2)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(0, y2)))) SUBST(z0, z1, App(App(z2, App(App(y3, y4), y5)), z4)) -> c16(SUBST(z0, z1, App(z2, App(App(y3, y4), y5)))) SUBST(z0, z1, App(App(z2, App(V(y3), y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(V(y3), y4)))) SUBST(App(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(Lam(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(S(y3), y4), y5)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y3), y4), y5)))) SUBST(V(y0), z1, App(App(z2, App(Lam(y3, y4), y5)), z4)) -> c16(SUBST(V(y0), z1, App(z2, App(Lam(y3, y4), y5)))) SUBST(V(0), z1, App(App(z2, App(Lam(S(y2), y3), y4)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(S(y2), y3), y4)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(0, y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y3), y4)))) SUBST(V(0), z1, App(App(z2, App(Lam(0, y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(0, y2), y3)))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) SUBST(z0, z1, App(App(App(y2, y3), z3), z4)) -> c16(SUBST(z0, z1, App(App(y2, y3), z3))) SUBST(z0, z1, App(App(V(y2), z3), z4)) -> c16(SUBST(z0, z1, App(V(y2), z3))) SUBST(App(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(Lam(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(V(S(y0)), z1, App(App(Lam(S(y2), y3), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3))) SUBST(V(y0), z1, App(App(Lam(y2, y3), z3), z4)) -> c16(SUBST(V(y0), z1, App(Lam(y2, y3), z3))) SUBST(V(0), z1, App(App(Lam(S(y1), y2), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(S(y1), y2), z3))) SUBST(V(S(y0)), z1, App(App(Lam(0, y2), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(0, y2), z3))) SUBST(V(0), z1, App(App(Lam(0, y1), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(0, y1), z3))) SUBST(z0, z1, App(App(z2, App(y3, y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(y3, y4)))) SUBST(z0, z1, App(App(z2, V(y3)), z4)) -> c16(SUBST(z0, z1, App(z2, V(y3)))) SUBST(App(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(Lam(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(S(y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(S(y3), y4)))) SUBST(V(y0), z1, App(App(z2, Lam(y3, y4)), z4)) -> c16(SUBST(V(y0), z1, App(z2, Lam(y3, y4)))) SUBST(V(0), z1, App(App(z2, Lam(S(y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(S(y2), y3)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(0, y3)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(0, y3)))) SUBST(V(0), z1, App(App(z2, Lam(0, y2)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(0, y2)))) SUBST(z0, z1, App(App(z2, App(App(y3, y4), y5)), z4)) -> c16(SUBST(z0, z1, App(z2, App(App(y3, y4), y5)))) SUBST(z0, z1, App(App(z2, App(V(y3), y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(V(y3), y4)))) SUBST(App(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(Lam(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(S(y3), y4), y5)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y3), y4), y5)))) SUBST(V(y0), z1, App(App(z2, App(Lam(y3, y4), y5)), z4)) -> c16(SUBST(V(y0), z1, App(z2, App(Lam(y3, y4), y5)))) SUBST(V(0), z1, App(App(z2, App(Lam(S(y2), y3), y4)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(S(y2), y3), y4)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(0, y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y3), y4)))) SUBST(V(0), z1, App(App(z2, App(Lam(0, y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(0, y2), y3)))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, EQTERM_2, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_1, c4_1, c33_1 ---------------------------------------- (165) CdtForwardInstantiationProof (BOTH BOUNDS(ID, ID)) Use forward instantiation to replace SUBST(z0, z1, App(V(y2), z3)) -> c16(SUBST(z0, z1, V(y2))) by SUBST(V(S(S(y0))), z1, App(V(S(S(y2))), z3)) -> c16(SUBST(V(S(S(y0))), z1, V(S(S(y2))))) ---------------------------------------- (166) Obligation: Complexity Dependency Tuples Problem Rules: subst(z0, z1, App(z2, z3)) -> mkapp(subst(z0, z1, z2), subst(z0, z1, z3)) subst(z0, z1, Lam(z2, z3)) -> subst[True][Ite](eqTerm(z0, V(z2)), z0, z1, Lam(z2, z3)) subst(z0, z1, V(z2)) -> subst[Ite](eqTerm(z0, V(z2)), z0, z1, V(z2)) mkapp(z0, z1) -> App(z0, z1) subst[True][Ite](False, z0, z1, Lam(z2, z3)) -> mklam(V(z2), subst(z0, z1, z3)) subst[True][Ite](True, z0, z1, z2) -> z2 eqTerm(App(z0, z1), V(z2)) -> False eqTerm(Lam(z0, z1), V(z2)) -> False eqTerm(V(z0), V(z1)) -> !EQ(z0, z1) !EQ(S(z0), S(z1)) -> !EQ(z0, z1) !EQ(0, S(z0)) -> False !EQ(S(z0), 0) -> False !EQ(0, 0) -> True mklam(V(z0), z1) -> Lam(z0, z1) subst[Ite](False, z0, z1, z2) -> z2 subst[Ite](True, z0, z1, z2) -> z1 red(App(z0, z1)) -> red[Let](App(z0, z1), red(z0)) red(Lam(z0, z1)) -> Lam(z0, z1) red(V(z0)) -> V(z0) red[Let](App(z0, z1), z2) -> red[Let][Let](App(z0, z1), z2, red(z1)) red[Let][Let](z0, Lam(z1, z2), z3) -> red(subst(V(z1), z3, z2)) red[Let][Let](z0, App(z1, z2), z3) -> App(App(z1, z2), z3) red[Let][Let](z0, V(z1), z2) -> App(V(z1), z2) Tuples: RED[LET](App(z0, z1), z2) -> c13(RED[LET][LET](App(z0, z1), z2, red(z1)), RED(z1)) RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST[TRUE][ITE](False, App(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(App(x0, x1), x2, x4)), SUBST(App(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, Lam(x0, x1), x2, Lam(x3, x4)) -> c11(MKLAM(V(x3), subst(Lam(x0, x1), x2, x4)), SUBST(Lam(x0, x1), x2, x4)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(S(x2), x3)) -> c11(MKLAM(V(S(x2)), subst(V(S(x0)), x1, x3)), SUBST(V(S(x0)), x1, x3)) SUBST[TRUE][ITE](False, V(0), x0, Lam(S(x1), x2)) -> c11(MKLAM(V(S(x1)), subst(V(0), x0, x2)), SUBST(V(0), x0, x2)) SUBST[TRUE][ITE](False, V(S(x0)), x1, Lam(0, x2)) -> c11(MKLAM(V(0), subst(V(S(x0)), x1, x2)), SUBST(V(S(x0)), x1, x2)) RED[LET][LET](App(x0, x1), Lam(z1, App(z2, z3)), y0) -> c8(RED(App(subst(V(z1), y0, z2), subst(V(z1), y0, z3))), SUBST(V(z1), y0, App(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, Lam(z2, z3)), y0) -> c8(RED(subst[True][Ite](!EQ(z1, z2), V(z1), y0, Lam(z2, z3))), SUBST(V(z1), y0, Lam(z2, z3))) RED[LET][LET](App(x0, x1), Lam(z1, V(z2)), y0) -> c8(RED(subst[Ite](!EQ(z1, z2), V(z1), y0, V(z2))), SUBST(V(z1), y0, V(z2))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), App(subst(V(z2), z6, z4), subst(V(z2), z6, z5)))), SUBST(V(z2), z6, App(z3, App(z4, z5)))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(z4, z5))), z6) -> c8(RED(App(subst(V(z2), z6, z3), subst[True][Ite](!EQ(z2, z4), V(z2), z6, Lam(z4, z5)))), SUBST(V(z2), z6, App(z3, Lam(z4, z5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(z4))), z5) -> c8(RED(App(subst(V(z2), z5, z3), subst[Ite](!EQ(z2, z4), V(z2), z5, V(z4)))), SUBST(V(z2), z5, App(z3, V(z4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(z3, z4), z5)), z6) -> c8(RED(App(App(subst(V(z2), z6, z3), subst(V(z2), z6, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(App(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(z3, z4), z5)), z6) -> c8(RED(App(subst[True][Ite](!EQ(z2, z3), V(z2), z6, Lam(z3, z4)), subst(V(z2), z6, z5))), SUBST(V(z2), z6, App(Lam(z3, z4), z5))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(z3), z4)), z5) -> c8(RED(App(subst[Ite](!EQ(z2, z3), V(z2), z5, V(z3)), subst(V(z2), z5, z4))), SUBST(V(z2), z5, App(V(z3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(App(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(App(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(V(y2), z4)), z5) -> c8(SUBST(V(z2), z5, App(V(y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(S(y2), y3), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(S(y2), y3), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(Lam(y2, y3), z4)), z5) -> c8(SUBST(V(z2), z5, App(Lam(y2, y3), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(S(y1), y2), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(S(y1), y2), z4))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(Lam(0, y2), z4)), z5) -> c8(SUBST(V(S(y0)), z5, App(Lam(0, y2), z4))) RED[LET][LET](App(z0, z1), Lam(0, App(Lam(0, y1), z4)), z5) -> c8(SUBST(V(0), z5, App(Lam(0, y1), z4))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, V(y3))), z5) -> c8(SUBST(V(z2), z5, App(z3, V(y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(S(y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(S(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, Lam(y3, y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, Lam(y3, y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(S(y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(S(y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, Lam(0, y3))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, Lam(0, y3)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, Lam(0, y2))), z5) -> c8(SUBST(V(0), z5, App(z3, Lam(0, y2)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(App(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(App(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(V(y3), y4))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(V(y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(S(y3), y4), y5))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(S(y3), y4), y5)))) RED[LET][LET](App(z0, z1), Lam(z2, App(z3, App(Lam(y3, y4), y5))), z5) -> c8(SUBST(V(z2), z5, App(z3, App(Lam(y3, y4), y5)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(S(y2), y3), y4))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(S(y2), y3), y4)))) RED[LET][LET](App(z0, z1), Lam(S(y0), App(z3, App(Lam(0, y3), y4))), z5) -> c8(SUBST(V(S(y0)), z5, App(z3, App(Lam(0, y3), y4)))) RED[LET][LET](App(z0, z1), Lam(0, App(z3, App(Lam(0, y2), y3))), z5) -> c8(SUBST(V(0), z5, App(z3, App(Lam(0, y2), y3)))) RED[LET][LET](App(z0, z1), Lam(S(S(y0)), V(S(S(y2)))), z4) -> c8(SUBST(V(S(S(y0))), z4, V(S(S(y2))))) !EQ'(S(S(S(y0))), S(S(S(y1)))) -> c4(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) SUBST(z0, z1, App(App(App(y2, y3), z3), z4)) -> c16(SUBST(z0, z1, App(App(y2, y3), z3))) SUBST(z0, z1, App(App(V(y2), z3), z4)) -> c16(SUBST(z0, z1, App(V(y2), z3))) SUBST(App(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(Lam(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(V(S(y0)), z1, App(App(Lam(S(y2), y3), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3))) SUBST(V(y0), z1, App(App(Lam(y2, y3), z3), z4)) -> c16(SUBST(V(y0), z1, App(Lam(y2, y3), z3))) SUBST(V(0), z1, App(App(Lam(S(y1), y2), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(S(y1), y2), z3))) SUBST(V(S(y0)), z1, App(App(Lam(0, y2), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(0, y2), z3))) SUBST(V(0), z1, App(App(Lam(0, y1), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(0, y1), z3))) SUBST(z0, z1, App(App(z2, App(y3, y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(y3, y4)))) SUBST(z0, z1, App(App(z2, V(y3)), z4)) -> c16(SUBST(z0, z1, App(z2, V(y3)))) SUBST(App(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(Lam(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(S(y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(S(y3), y4)))) SUBST(V(y0), z1, App(App(z2, Lam(y3, y4)), z4)) -> c16(SUBST(V(y0), z1, App(z2, Lam(y3, y4)))) SUBST(V(0), z1, App(App(z2, Lam(S(y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(S(y2), y3)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(0, y3)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(0, y3)))) SUBST(V(0), z1, App(App(z2, Lam(0, y2)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(0, y2)))) SUBST(z0, z1, App(App(z2, App(App(y3, y4), y5)), z4)) -> c16(SUBST(z0, z1, App(z2, App(App(y3, y4), y5)))) SUBST(z0, z1, App(App(z2, App(V(y3), y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(V(y3), y4)))) SUBST(App(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(Lam(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(S(y3), y4), y5)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y3), y4), y5)))) SUBST(V(y0), z1, App(App(z2, App(Lam(y3, y4), y5)), z4)) -> c16(SUBST(V(y0), z1, App(z2, App(Lam(y3, y4), y5)))) SUBST(V(0), z1, App(App(z2, App(Lam(S(y2), y3), y4)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(S(y2), y3), y4)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(0, y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y3), y4)))) SUBST(V(0), z1, App(App(z2, App(Lam(0, y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(0, y2), y3)))) SUBST(V(S(S(y0))), z1, App(V(S(S(y2))), z3)) -> c16(SUBST(V(S(S(y0))), z1, V(S(S(y2))))) S tuples: RED(App(z0, z1)) -> c20(RED[LET](App(z0, z1), red(z0)), RED(z0)) RED(Lam(z0, z1)) -> c21 RED(V(z0)) -> c22 MKLAM(V(z0), z1) -> c34 SUBST(App(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, App(z0, z1), x1, Lam(z2, x3))) SUBST(Lam(z0, z1), x1, Lam(z2, x3)) -> c18(SUBST[TRUE][ITE](False, Lam(z0, z1), x1, Lam(z2, x3))) SUBST(V(S(z0)), x1, Lam(S(z1), x3)) -> c18(SUBST[TRUE][ITE](!EQ(z0, z1), V(S(z0)), x1, Lam(S(z1), x3)), EQTERM(V(S(z0)), V(S(z1)))) SUBST(V(0), x1, Lam(S(z0), x3)) -> c18(SUBST[TRUE][ITE](False, V(0), x1, Lam(S(z0), x3))) SUBST(V(S(z0)), x1, Lam(0, x3)) -> c18(SUBST[TRUE][ITE](False, V(S(z0)), x1, Lam(0, x3))) SUBST(V(0), x1, Lam(0, x3)) -> c18 SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3)) -> c16(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(Lam(y2, y3), z3)) -> c16(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(Lam(S(y1), y2), z3)) -> c16(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(Lam(0, y2), z3)) -> c16(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(Lam(0, y1), z3)) -> c16(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(y2, y3))) -> c17(SUBST(z0, z1, App(y2, y3))) SUBST(z0, z1, App(z2, V(y2))) -> c17(SUBST(z0, z1, V(y2))) SUBST(App(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(App(y0, y1), z1, Lam(y3, y4))) SUBST(Lam(y0, y1), z1, App(z2, Lam(y3, y4))) -> c17(SUBST(Lam(y0, y1), z1, Lam(y3, y4))) SUBST(V(S(y0)), z1, App(z2, Lam(S(y2), y3))) -> c17(SUBST(V(S(y0)), z1, Lam(S(y2), y3))) SUBST(V(y0), z1, App(z2, Lam(y2, y3))) -> c17(SUBST(V(y0), z1, Lam(y2, y3))) SUBST(V(0), z1, App(z2, Lam(S(y1), y2))) -> c17(SUBST(V(0), z1, Lam(S(y1), y2))) SUBST(V(S(y0)), z1, App(z2, Lam(0, y2))) -> c17(SUBST(V(S(y0)), z1, Lam(0, y2))) SUBST(V(0), z1, App(z2, Lam(0, y1))) -> c17(SUBST(V(0), z1, Lam(0, y1))) SUBST(z0, z1, App(z2, App(App(y2, y3), y4))) -> c17(SUBST(z0, z1, App(App(y2, y3), y4))) SUBST(z0, z1, App(z2, App(V(y2), y3))) -> c17(SUBST(z0, z1, App(V(y2), y3))) SUBST(App(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(App(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y3, y4), y5))) -> c17(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), y5))) SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y2), y3), y4))) -> c17(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), y4))) SUBST(V(y0), z1, App(z2, App(Lam(y2, y3), y4))) -> c17(SUBST(V(y0), z1, App(Lam(y2, y3), y4))) SUBST(V(0), z1, App(z2, App(Lam(S(y1), y2), y3))) -> c17(SUBST(V(0), z1, App(Lam(S(y1), y2), y3))) SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y2), y3))) -> c17(SUBST(V(S(y0)), z1, App(Lam(0, y2), y3))) SUBST(V(0), z1, App(z2, App(Lam(0, y1), y2))) -> c17(SUBST(V(0), z1, App(Lam(0, y1), y2))) SUBST(V(S(S(y0))), z1, V(S(S(y1)))) -> c19(EQTERM(V(S(S(y0))), V(S(S(y1))))) SUBST(V(S(S(y0))), z1, Lam(S(S(y1)), z3)) -> c18(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(V(S(S(S(y0)))), V(S(S(S(y1))))) -> c33(!EQ'(S(S(S(y0))), S(S(S(y1))))) SUBST(z0, z1, App(App(App(y2, y3), z3), z4)) -> c16(SUBST(z0, z1, App(App(y2, y3), z3))) SUBST(z0, z1, App(App(V(y2), z3), z4)) -> c16(SUBST(z0, z1, App(V(y2), z3))) SUBST(App(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(App(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(Lam(y0, y1), z1, App(App(Lam(y3, y4), z3), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(Lam(y3, y4), z3))) SUBST(V(S(y0)), z1, App(App(Lam(S(y2), y3), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(S(y2), y3), z3))) SUBST(V(y0), z1, App(App(Lam(y2, y3), z3), z4)) -> c16(SUBST(V(y0), z1, App(Lam(y2, y3), z3))) SUBST(V(0), z1, App(App(Lam(S(y1), y2), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(S(y1), y2), z3))) SUBST(V(S(y0)), z1, App(App(Lam(0, y2), z3), z4)) -> c16(SUBST(V(S(y0)), z1, App(Lam(0, y2), z3))) SUBST(V(0), z1, App(App(Lam(0, y1), z3), z4)) -> c16(SUBST(V(0), z1, App(Lam(0, y1), z3))) SUBST(z0, z1, App(App(z2, App(y3, y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(y3, y4)))) SUBST(z0, z1, App(App(z2, V(y3)), z4)) -> c16(SUBST(z0, z1, App(z2, V(y3)))) SUBST(App(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(Lam(y0, y1), z1, App(App(z2, Lam(y4, y5)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, Lam(y4, y5)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(S(y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(S(y3), y4)))) SUBST(V(y0), z1, App(App(z2, Lam(y3, y4)), z4)) -> c16(SUBST(V(y0), z1, App(z2, Lam(y3, y4)))) SUBST(V(0), z1, App(App(z2, Lam(S(y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(S(y2), y3)))) SUBST(V(S(y0)), z1, App(App(z2, Lam(0, y3)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, Lam(0, y3)))) SUBST(V(0), z1, App(App(z2, Lam(0, y2)), z4)) -> c16(SUBST(V(0), z1, App(z2, Lam(0, y2)))) SUBST(z0, z1, App(App(z2, App(App(y3, y4), y5)), z4)) -> c16(SUBST(z0, z1, App(z2, App(App(y3, y4), y5)))) SUBST(z0, z1, App(App(z2, App(V(y3), y4)), z4)) -> c16(SUBST(z0, z1, App(z2, App(V(y3), y4)))) SUBST(App(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(App(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(Lam(y0, y1), z1, App(App(z2, App(Lam(y4, y5), y6)), z4)) -> c16(SUBST(Lam(y0, y1), z1, App(z2, App(Lam(y4, y5), y6)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(S(y3), y4), y5)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(S(y3), y4), y5)))) SUBST(V(y0), z1, App(App(z2, App(Lam(y3, y4), y5)), z4)) -> c16(SUBST(V(y0), z1, App(z2, App(Lam(y3, y4), y5)))) SUBST(V(0), z1, App(App(z2, App(Lam(S(y2), y3), y4)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(S(y2), y3), y4)))) SUBST(V(S(y0)), z1, App(App(z2, App(Lam(0, y3), y4)), z4)) -> c16(SUBST(V(S(y0)), z1, App(z2, App(Lam(0, y3), y4)))) SUBST(V(0), z1, App(App(z2, App(Lam(0, y2), y3)), z4)) -> c16(SUBST(V(0), z1, App(z2, App(Lam(0, y2), y3)))) SUBST(V(S(S(y0))), z1, App(V(S(S(y2))), z3)) -> c16(SUBST(V(S(S(y0))), z1, V(S(S(y2))))) K tuples: EQTERM(App(App(y0, y1), z1), App(App(y2, y3), z3)) -> c23(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(Lam(y0, y1), z1), App(Lam(y2, y3), z3)) -> c23(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(V(S(S(y0))), z1), App(V(S(S(y1))), z3)) -> c23(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(y0, y1)), App(z2, App(y2, y3))) -> c24(EQTERM(App(y0, y1), App(y2, y3))) EQTERM(App(z0, Lam(y0, y1)), App(z2, Lam(y2, y3))) -> c24(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(App(z0, V(S(S(y0)))), App(z2, V(S(S(y1))))) -> c24(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(App(z0, App(App(y0, y1), y2)), App(z2, App(App(y3, y4), y5))) -> c24(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(App(z0, App(Lam(y0, y1), y2)), App(z2, App(Lam(y3, y4), y5))) -> c24(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(App(z0, App(V(S(S(y0))), y1)), App(z2, App(V(S(S(y2))), y3))) -> c24(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(S(S(y0)), z1), Lam(S(S(y1)), z3)) -> c28(!EQ'(S(S(y0)), S(S(y1)))) EQTERM(Lam(z0, Lam(y0, y1)), Lam(z2, Lam(y2, y3))) -> c29(EQTERM(Lam(y0, y1), Lam(y2, y3))) EQTERM(Lam(z0, V(S(S(y0)))), Lam(z2, V(S(S(y1))))) -> c29(EQTERM(V(S(S(y0))), V(S(S(y1))))) EQTERM(Lam(z0, App(App(y0, y1), y2)), Lam(z2, App(App(y3, y4), y5))) -> c29(EQTERM(App(App(y0, y1), y2), App(App(y3, y4), y5))) EQTERM(Lam(z0, App(Lam(y0, y1), y2)), Lam(z2, App(Lam(y3, y4), y5))) -> c29(EQTERM(App(Lam(y0, y1), y2), App(Lam(y3, y4), y5))) EQTERM(Lam(z0, App(V(S(S(y0))), y1)), Lam(z2, App(V(S(S(y2))), y3))) -> c29(EQTERM(App(V(S(S(y0))), y1), App(V(S(S(y2))), y3))) EQTERM(Lam(z0, App(y0, App(y1, y2))), Lam(z2, App(y3, App(y4, y5)))) -> c29(EQTERM(App(y0, App(y1, y2)), App(y3, App(y4, y5)))) EQTERM(Lam(z0, App(y0, Lam(y1, y2))), Lam(z2, App(y3, Lam(y4, y5)))) -> c29(EQTERM(App(y0, Lam(y1, y2)), App(y3, Lam(y4, y5)))) EQTERM(Lam(z0, App(y0, V(S(S(y1))))), Lam(z2, App(y2, V(S(S(y3)))))) -> c29(EQTERM(App(y0, V(S(S(y1)))), App(y2, V(S(S(y3)))))) EQTERM(Lam(z0, App(y0, App(App(y1, y2), y3))), Lam(z2, App(y4, App(App(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(App(y1, y2), y3)), App(y4, App(App(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(Lam(y1, y2), y3))), Lam(z2, App(y4, App(Lam(y5, y6), y7)))) -> c29(EQTERM(App(y0, App(Lam(y1, y2), y3)), App(y4, App(Lam(y5, y6), y7)))) EQTERM(Lam(z0, App(y0, App(V(S(S(y1))), y2))), Lam(z2, App(y3, App(V(S(S(y4))), y5)))) -> c29(EQTERM(App(y0, App(V(S(S(y1))), y2)), App(y3, App(V(S(S(y4))), y5)))) EQTERM(Lam(z0, Lam(S(S(y0)), y1)), Lam(z2, Lam(S(S(y2)), y3))) -> c29(EQTERM(Lam(S(S(y0)), y1), Lam(S(S(y2)), y3))) Defined Rule Symbols: subst_3, mkapp_2, subst[True][Ite]_4, eqTerm_2, !EQ_2, mklam_2, subst[Ite]_4, red_1, red[Let]_2, red[Let][Let]_3 Defined Pair Symbols: RED[LET]_2, RED_1, MKLAM_2, SUBST_3, SUBST[TRUE][ITE]_4, RED[LET][LET]_3, EQTERM_2, !EQ'_2 Compound Symbols: c13_2, c20_2, c21, c22, c34, c18_1, c18_2, c11_2, c8_2, c18, c16_1, c17_1, c19_1, c23_1, c24_1, c28_1, c29_1, c8_1, c4_1, c33_1