YES
0 QTRS
↳1 Overlay + Local Confluence (⇔, 0 ms)
↳2 QTRS
↳3 DependencyPairsProof (⇔, 0 ms)
↳4 QDP
↳5 DependencyGraphProof (⇔, 0 ms)
↳6 AND
↳7 QDP
↳8 UsableRulesProof (⇔, 0 ms)
↳9 QDP
↳10 QReductionProof (⇔, 0 ms)
↳11 QDP
↳12 QDPSizeChangeProof (⇔, 0 ms)
↳13 YES
↳14 QDP
↳15 UsableRulesProof (⇔, 0 ms)
↳16 QDP
↳17 QReductionProof (⇔, 0 ms)
↳18 QDP
↳19 QDPSizeChangeProof (⇔, 0 ms)
↳20 YES
↳21 QDP
↳22 UsableRulesProof (⇔, 0 ms)
↳23 QDP
↳24 QReductionProof (⇔, 0 ms)
↳25 QDP
↳26 QDPSizeChangeProof (⇔, 0 ms)
↳27 YES
↳28 QDP
↳29 UsableRulesProof (⇔, 0 ms)
↳30 QDP
↳31 QReductionProof (⇔, 0 ms)
↳32 QDP
↳33 TransformationProof (⇔, 0 ms)
↳34 QDP
↳35 TransformationProof (⇔, 0 ms)
↳36 QDP
↳37 TransformationProof (⇔, 0 ms)
↳38 QDP
↳39 UsableRulesProof (⇔, 0 ms)
↳40 QDP
↳41 QReductionProof (⇔, 0 ms)
↳42 QDP
↳43 Induction-Processor (⇒, 2 ms)
↳44 AND
↳45 QDP
↳46 PisEmptyProof (⇔, 0 ms)
↳47 YES
↳48 QTRS
↳49 QTRSRRRProof (⇔, 39 ms)
↳50 QTRS
↳51 QTRSRRRProof (⇔, 0 ms)
↳52 QTRS
↳53 RisEmptyProof (⇔, 0 ms)
↳54 YES
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
DOUBLE(s(x)) → DOUBLE(x)
DEL(x, cons(y, xs)) → IF(eq(x, y), x, y, xs)
DEL(x, cons(y, xs)) → EQ(x, y)
IF(false, x, y, xs) → DEL(x, xs)
EQ(s(x), s(y)) → EQ(x, y)
DOUBLELIST(cons(x, xs)) → DOUBLE(x)
DOUBLELIST(cons(x, xs)) → DOUBLELIST(del(first(cons(x, xs)), cons(x, xs)))
DOUBLELIST(cons(x, xs)) → DEL(first(cons(x, xs)), cons(x, xs))
DOUBLELIST(cons(x, xs)) → FIRST(cons(x, xs))
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
EQ(s(x), s(y)) → EQ(x, y)
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
EQ(s(x), s(y)) → EQ(x, y)
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
EQ(s(x), s(y)) → EQ(x, y)
From the DPs we obtained the following set of size-change graphs:
IF(false, x, y, xs) → DEL(x, xs)
DEL(x, cons(y, xs)) → IF(eq(x, y), x, y, xs)
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
IF(false, x, y, xs) → DEL(x, xs)
DEL(x, cons(y, xs)) → IF(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
IF(false, x, y, xs) → DEL(x, xs)
DEL(x, cons(y, xs)) → IF(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
From the DPs we obtained the following set of size-change graphs:
DOUBLE(s(x)) → DOUBLE(x)
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
DOUBLE(s(x)) → DOUBLE(x)
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
DOUBLE(s(x)) → DOUBLE(x)
From the DPs we obtained the following set of size-change graphs:
DOUBLELIST(cons(x, xs)) → DOUBLELIST(del(first(cons(x, xs)), cons(x, xs)))
double(0) → 0
double(s(x)) → s(s(double(x)))
del(x, nil) → nil
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
first(nil) → 0
first(cons(x, xs)) → x
doublelist(nil) → nil
doublelist(cons(x, xs)) → cons(double(x), doublelist(del(first(cons(x, xs)), cons(x, xs))))
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(del(first(cons(x, xs)), cons(x, xs)))
first(cons(x, xs)) → x
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, nil) → nil
double(0)
double(s(x0))
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
doublelist(nil)
doublelist(cons(x0, x1))
double(0)
double(s(x0))
doublelist(nil)
doublelist(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(del(first(cons(x, xs)), cons(x, xs)))
first(cons(x, xs)) → x
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, nil) → nil
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(first(cons(x, xs)), x), first(cons(x, xs)), x, xs)) → DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(first(cons(x, xs)), x), first(cons(x, xs)), x, xs))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(first(cons(x, xs)), x), first(cons(x, xs)), x, xs))
first(cons(x, xs)) → x
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, nil) → nil
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), first(cons(x, xs)), x, xs)) → DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), first(cons(x, xs)), x, xs))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), first(cons(x, xs)), x, xs))
first(cons(x, xs)) → x
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, nil) → nil
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), x, x, xs)) → DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), x, x, xs))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), x, x, xs))
first(cons(x, xs)) → x
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
eq(0, 0) → true
eq(0, s(y)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, nil) → nil
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), x, x, xs))
eq(0, 0) → true
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
del(x, nil) → nil
eq(0, s(y)) → false
eq(s(x), 0) → false
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
first(nil)
first(cons(x0, x1))
first(nil)
first(cons(x0, x1))
DOUBLELIST(cons(x, xs)) → DOUBLELIST(if(eq(x, x), x, x, xs))
eq(0, 0) → true
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
del(x, nil) → nil
eq(0, s(y)) → false
eq(s(x), 0) → false
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
POL(0) = 0
POL(DOUBLELIST(x1)) = x1
POL(cons(x1, x2)) = 1 + x2
POL(del(x1, x2)) = x2
POL(eq(x1, x2)) = x1
POL(false_renamed) = 0
POL(if(x1, x2, x3, x4)) = 1 + x4
POL(nil) = 0
POL(s(x1)) = x1
POL(true_renamed) = 0
proof of internal # AProVE Commit ID: 3a20a6ef7432c3f292db1a8838479c42bf5e3b22 root 20240618 unpublished Partial correctness of the following Program [x, v13, v14, v15, v16, v17, v18, v19, v20, v21, x'', y', xs', x1, y'', y1, xs1, x3, x2, x', y, y2, x4] equal_bool(true, false) -> false equal_bool(false, true) -> false equal_bool(true, true) -> true equal_bool(false, false) -> true true and x -> x false and x -> false true or x -> true false or x -> x not(false) -> true not(true) -> false isa_true(true) -> true isa_true(false) -> false isa_false(true) -> false isa_false(false) -> true equal_sort[a19](0, 0) -> true equal_sort[a19](0, s(v13)) -> false equal_sort[a19](s(v14), 0) -> false equal_sort[a19](s(v14), s(v15)) -> equal_sort[a19](v14, v15) equal_sort[a4](cons(v16, v17), cons(v18, v19)) -> equal_sort[a19](v16, v18) and equal_sort[a4](v17, v19) equal_sort[a4](cons(v16, v17), nil) -> false equal_sort[a4](nil, cons(v20, v21)) -> false equal_sort[a4](nil, nil) -> true equal_sort[a18](true_renamed, true_renamed) -> true equal_sort[a18](true_renamed, false_renamed) -> false equal_sort[a18](false_renamed, true_renamed) -> false equal_sort[a18](false_renamed, false_renamed) -> true equal_sort[a37](witness_sort[a37], witness_sort[a37]) -> true if'(true_renamed, x'', y', xs') -> true if'(false_renamed, x1, y'', cons(y1, xs1)) -> if'(eq(x1, y1), x1, y1, xs1) if'(false_renamed, x1, y'', nil) -> false del'(x3, nil) -> false equal_sort[a18](eq(x2, y1), true_renamed) -> true | del'(x2, cons(y1, xs1)) -> true equal_sort[a18](eq(x2, y1), true_renamed) -> false | del'(x2, cons(y1, xs1)) -> del'(x2, xs1) eq(0, 0) -> true_renamed eq(s(x'), s(y)) -> eq(x', y) eq(0, s(y2)) -> false_renamed eq(s(x4), 0) -> false_renamed if(true_renamed, x'', y', xs') -> xs' if(false_renamed, x1, y'', cons(y1, xs1)) -> cons(y'', if(eq(x1, y1), x1, y1, xs1)) if(false_renamed, x1, y'', nil) -> cons(y'', nil) del(x3, nil) -> nil equal_sort[a18](eq(x2, y1), true_renamed) -> true | del(x2, cons(y1, xs1)) -> xs1 equal_sort[a18](eq(x2, y1), true_renamed) -> false | del(x2, cons(y1, xs1)) -> cons(y1, del(x2, xs1)) using the following formula: x:sort[a19],xs:sort[a4].if'(eq(x, x), x, x, xs)=true could be successfully shown: (0) Formula (1) Induction by data structure [EQUIVALENT, 0 ms] (2) AND (3) Formula (4) Symbolic evaluation [EQUIVALENT, 0 ms] (5) YES (6) Formula (7) Symbolic evaluation [EQUIVALENT, 0 ms] (8) Formula (9) Case Analysis [EQUIVALENT, 0 ms] (10) AND (11) Formula (12) Inverse Substitution [SOUND, 0 ms] (13) Formula (14) Induction by data structure [SOUND, 0 ms] (15) AND (16) Formula (17) Symbolic evaluation [EQUIVALENT, 0 ms] (18) YES (19) Formula (20) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms] (21) YES (22) Formula (23) Inverse Substitution [SOUND, 0 ms] (24) Formula (25) Induction by data structure [SOUND, 0 ms] (26) AND (27) Formula (28) Symbolic evaluation [EQUIVALENT, 0 ms] (29) YES (30) Formula (31) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms] (32) YES ---------------------------------------- (0) Obligation: Formula: x:sort[a19],xs:sort[a4].if'(eq(x, x), x, x, xs)=true There are no hypotheses. ---------------------------------------- (1) Induction by data structure (EQUIVALENT) Induction by data structure sort[a19] generates the following cases: 1. Base Case: Formula: xs:sort[a4].if'(eq(0, 0), 0, 0, xs)=true There are no hypotheses. 1. Step Case: Formula: n:sort[a19],xs:sort[a4].if'(eq(s(n), s(n)), s(n), s(n), xs)=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (2) Complex Obligation (AND) ---------------------------------------- (3) Obligation: Formula: xs:sort[a4].if'(eq(0, 0), 0, 0, xs)=true There are no hypotheses. ---------------------------------------- (4) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: True ---------------------------------------- (5) YES ---------------------------------------- (6) Obligation: Formula: n:sort[a19],xs:sort[a4].if'(eq(s(n), s(n)), s(n), s(n), xs)=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (7) Symbolic evaluation (EQUIVALENT) Could be shown by simple symbolic evaluation. ---------------------------------------- (8) Obligation: Formula: n:sort[a19],xs:sort[a4].if'(eq(n, n), s(n), s(n), xs)=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (9) Case Analysis (EQUIVALENT) Case analysis leads to the following new obligations: Formula: n:sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(n, n), s(n), s(n), cons(x_1, x_2))=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true Formula: n:sort[a19].if'(eq(n, n), s(n), s(n), nil)=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (10) Complex Obligation (AND) ---------------------------------------- (11) Obligation: Formula: n:sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(n, n), s(n), s(n), cons(x_1, x_2))=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (12) Inverse Substitution (SOUND) The formula could be generalised by inverse substitution to: n:sort[a19],n':sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(n, n), n', n', cons(x_1, x_2))=true Inverse substitution used: [s(n)/n'] ---------------------------------------- (13) Obligation: Formula: n:sort[a19],n':sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(n, n), n', n', cons(x_1, x_2))=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (14) Induction by data structure (SOUND) Induction by data structure sort[a19] generates the following cases: 1. Base Case: Formula: n':sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(0, 0), n', n', cons(x_1, x_2))=true There are no hypotheses. 1. Step Case: Formula: n'':sort[a19],n':sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(s(n''), s(n'')), n', n', cons(x_1, x_2))=true Hypotheses: n'':sort[a19],!n':sort[a19],!x_1:sort[a19],!x_2:sort[a4].if'(eq(n'', n''), n', n', cons(x_1, x_2))=true ---------------------------------------- (15) Complex Obligation (AND) ---------------------------------------- (16) Obligation: Formula: n':sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(0, 0), n', n', cons(x_1, x_2))=true There are no hypotheses. ---------------------------------------- (17) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: True ---------------------------------------- (18) YES ---------------------------------------- (19) Obligation: Formula: n'':sort[a19],n':sort[a19],x_1:sort[a19],x_2:sort[a4].if'(eq(s(n''), s(n'')), n', n', cons(x_1, x_2))=true Hypotheses: n'':sort[a19],!n':sort[a19],!x_1:sort[a19],!x_2:sort[a4].if'(eq(n'', n''), n', n', cons(x_1, x_2))=true ---------------------------------------- (20) Symbolic evaluation under hypothesis (EQUIVALENT) Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses: n'':sort[a19],!n':sort[a19],!x_1:sort[a19],!x_2:sort[a4].if'(eq(n'', n''), n', n', cons(x_1, x_2))=true ---------------------------------------- (21) YES ---------------------------------------- (22) Obligation: Formula: n:sort[a19].if'(eq(n, n), s(n), s(n), nil)=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (23) Inverse Substitution (SOUND) The formula could be generalised by inverse substitution to: n:sort[a19],n':sort[a19].if'(eq(n, n), n', n', nil)=true Inverse substitution used: [s(n)/n'] ---------------------------------------- (24) Obligation: Formula: n:sort[a19],n':sort[a19].if'(eq(n, n), n', n', nil)=true Hypotheses: n:sort[a19],!xs:sort[a4].if'(eq(n, n), n, n, xs)=true ---------------------------------------- (25) Induction by data structure (SOUND) Induction by data structure sort[a19] generates the following cases: 1. Base Case: Formula: n':sort[a19].if'(eq(0, 0), n', n', nil)=true There are no hypotheses. 1. Step Case: Formula: n'':sort[a19],n':sort[a19].if'(eq(s(n''), s(n'')), n', n', nil)=true Hypotheses: n'':sort[a19],!n':sort[a19].if'(eq(n'', n''), n', n', nil)=true ---------------------------------------- (26) Complex Obligation (AND) ---------------------------------------- (27) Obligation: Formula: n':sort[a19].if'(eq(0, 0), n', n', nil)=true There are no hypotheses. ---------------------------------------- (28) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: True ---------------------------------------- (29) YES ---------------------------------------- (30) Obligation: Formula: n'':sort[a19],n':sort[a19].if'(eq(s(n''), s(n'')), n', n', nil)=true Hypotheses: n'':sort[a19],!n':sort[a19].if'(eq(n'', n''), n', n', nil)=true ---------------------------------------- (31) Symbolic evaluation under hypothesis (EQUIVALENT) Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses: n'':sort[a19],!n':sort[a19].if'(eq(n'', n''), n', n', nil)=true ---------------------------------------- (32) YES
eq(0, 0) → true
eq(s(x), s(y)) → eq(x, y)
if(true, x, y, xs) → xs
if(false, x, y, xs) → cons(y, del(x, xs))
del(x, cons(y, xs)) → if(eq(x, y), x, y, xs)
del(x, nil) → nil
eq(0, s(y)) → false
eq(s(x), 0) → false
del(x0, nil)
del(x0, cons(x1, x2))
if(true, x0, x1, x2)
if(false, x0, x1, x2)
eq(0, 0)
eq(0, s(x0))
eq(s(x0), 0)
eq(s(x0), s(x1))
if'(true_renamed, x'', y', xs') → true
if'(false_renamed, x1, y'', xs'') → del'(x1, xs'')
del'(x2, cons(y1, xs1)) → if'(eq(x2, y1), x2, y1, xs1)
del'(x3, nil) → false
eq(0, 0) → true_renamed
eq(s(x'), s(y)) → eq(x', y)
if(true_renamed, x'', y', xs') → xs'
if(false_renamed, x1, y'', xs'') → cons(y'', del(x1, xs''))
del(x2, cons(y1, xs1)) → if(eq(x2, y1), x2, y1, xs1)
del(x3, nil) → nil
eq(0, s(y2)) → false_renamed
eq(s(x4), 0) → false_renamed
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a19](0, 0) → true
equal_sort[a19](0, s(v13)) → false
equal_sort[a19](s(v14), 0) → false
equal_sort[a19](s(v14), s(v15)) → equal_sort[a19](v14, v15)
equal_sort[a4](cons(v16, v17), cons(v18, v19)) → and(equal_sort[a19](v16, v18), equal_sort[a4](v17, v19))
equal_sort[a4](cons(v16, v17), nil) → false
equal_sort[a4](nil, cons(v20, v21)) → false
equal_sort[a4](nil, nil) → true
equal_sort[a18](true_renamed, true_renamed) → true
equal_sort[a18](true_renamed, false_renamed) → false
equal_sort[a18](false_renamed, true_renamed) → false
equal_sort[a18](false_renamed, false_renamed) → true
equal_sort[a37](witness_sort[a37], witness_sort[a37]) → true
[if'4, del'2] > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
[if'4, del'2] > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
[if'4, del'2] > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
0 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
0 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
0 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
s1 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
s1 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
s1 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
[if4, del2] > cons2 > and2 > eq2
[if4, del2] > cons2 > equalsort[a19]2 > eq2
[if4, del2] > nil > eq2
or2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
or2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
or2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
isafalse1 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
isafalse1 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
isafalse1 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
equalsort[a4]2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
equalsort[a4]2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
equalsort[a4]2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
equalsort[a18]2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > [truerenamed, false] > eq2
equalsort[a18]2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > and2 > eq2
equalsort[a18]2 > [true, falserenamed, equalbool2, not1, equalsort[a37]2, witnesssort[a37]] > cons2 > equalsort[a19]2 > eq2
if'4: [2,4,1,3]
truerenamed: multiset
true: multiset
falserenamed: multiset
del'2: [1,2]
cons2: multiset
eq2: multiset
nil: multiset
false: multiset
0: multiset
s1: [1]
if4: [4,2,1,3]
del2: [2,1]
equalbool2: [1,2]
and2: multiset
or2: multiset
not1: [1]
isafalse1: multiset
equalsort[a19]2: [1,2]
equalsort[a4]2: multiset
equalsort[a18]2: multiset
equalsort[a37]2: multiset
witnesssort[a37]: multiset
if'(true_renamed, x'', y', xs') → true
if'(false_renamed, x1, y'', xs'') → del'(x1, xs'')
del'(x2, cons(y1, xs1)) → if'(eq(x2, y1), x2, y1, xs1)
del'(x3, nil) → false
eq(0, 0) → true_renamed
eq(s(x'), s(y)) → eq(x', y)
if(true_renamed, x'', y', xs') → xs'
if(false_renamed, x1, y'', xs'') → cons(y'', del(x1, xs''))
del(x2, cons(y1, xs1)) → if(eq(x2, y1), x2, y1, xs1)
del(x3, nil) → nil
eq(0, s(y2)) → false_renamed
eq(s(x4), 0) → false_renamed
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a19](0, 0) → true
equal_sort[a19](0, s(v13)) → false
equal_sort[a19](s(v14), 0) → false
equal_sort[a19](s(v14), s(v15)) → equal_sort[a19](v14, v15)
equal_sort[a4](cons(v16, v17), cons(v18, v19)) → and(equal_sort[a19](v16, v18), equal_sort[a4](v17, v19))
equal_sort[a4](cons(v16, v17), nil) → false
equal_sort[a4](nil, cons(v20, v21)) → false
equal_sort[a4](nil, nil) → true
equal_sort[a18](true_renamed, true_renamed) → true
equal_sort[a18](true_renamed, false_renamed) → false
equal_sort[a18](false_renamed, true_renamed) → false
equal_sort[a18](false_renamed, false_renamed) → true
equal_sort[a37](witness_sort[a37], witness_sort[a37]) → true
isa_true(true) → true
isa_true(false) → false
isatrue1 > false > true
true=1
false=1
isa_true_1=0
isa_true(true) → true
isa_true(false) → false