0 QTRS
↳1 Overlay + Local Confluence (⇔)
↳2 QTRS
↳3 DependencyPairsProof (⇔)
↳4 QDP
↳5 DependencyGraphProof (⇔)
↳6 AND
↳7 QDP
↳8 UsableRulesProof (⇔)
↳9 QDP
↳10 QReductionProof (⇔)
↳11 QDP
↳12 QDPSizeChangeProof (⇔)
↳13 YES
↳14 QDP
↳15 UsableRulesProof (⇔)
↳16 QDP
↳17 QReductionProof (⇔)
↳18 QDP
↳19 QDPSizeChangeProof (⇔)
↳20 YES
↳21 QDP
↳22 UsableRulesProof (⇔)
↳23 QDP
↳24 QReductionProof (⇔)
↳25 QDP
↳26 QDPSizeChangeProof (⇔)
↳27 YES
↳28 QDP
↳29 UsableRulesProof (⇔)
↳30 QDP
↳31 QReductionProof (⇔)
↳32 QDP
↳33 NonInfProof (⇔)
↳34 QDP
↳35 Narrowing (⇔)
↳36 QDP
↳37 DependencyGraphProof (⇔)
↳38 QDP
↳39 Narrowing (⇔)
↳40 QDP
↳41 DependencyGraphProof (⇔)
↳42 QDP
↳43 Narrowing (⇔)
↳44 QDP
↳45 Instantiation (⇔)
↳46 QDP
↳47 Instantiation (⇔)
↳48 QDP
↳49 Rewriting (⇔)
↳50 QDP
↳51 Induction-Processor (⇐)
↳52 AND
↳53 QDP
↳54 DependencyGraphProof (⇔)
↳55 TRUE
↳56 QTRS
↳57 QTRSRRRProof (⇔)
↳58 QTRS
↳59 QTRSRRRProof (⇔)
↳60 QTRS
↳61 RisEmptyProof (⇔)
↳62 YES
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
MINUS(s(x), y) → IF(gt(s(x), y), x, y)
MINUS(s(x), y) → GT(s(x), y)
IF(true, x, y) → MINUS(x, y)
GCD(x, y) → IF1(ge(x, y), x, y)
GCD(x, y) → GE(x, y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
IF1(true, x, y) → GT(y, 0)
IF1(false, x, y) → GCD(y, x)
IF2(true, x, y) → GCD(minus(x, y), y)
IF2(true, x, y) → MINUS(x, y)
GT(s(x), s(y)) → GT(x, y)
GE(s(x), s(y)) → GE(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GE(s(x), s(y)) → GE(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GE(s(x), s(y)) → GE(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GE(s(x), s(y)) → GE(x, y)
From the DPs we obtained the following set of size-change graphs:
GT(s(x), s(y)) → GT(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GT(s(x), s(y)) → GT(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GT(s(x), s(y)) → GT(x, y)
From the DPs we obtained the following set of size-change graphs:
IF(true, x, y) → MINUS(x, y)
MINUS(s(x), y) → IF(gt(s(x), y), x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF(true, x, y) → MINUS(x, y)
MINUS(s(x), y) → IF(gt(s(x), y), x, y)
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
gt(0, y) → false
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF(true, x, y) → MINUS(x, y)
MINUS(s(x), y) → IF(gt(s(x), y), x, y)
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
gt(0, y) → false
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
From the DPs we obtained the following set of size-change graphs:
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(x, y) → IF1(ge(x, y), x, y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
IF1(false, x, y) → GCD(y, x)
minus(s(x), y) → if(gt(s(x), y), x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
gcd(x, y) → if1(ge(x, y), x, y)
if1(true, x, y) → if2(gt(y, 0), x, y)
if1(false, x, y) → gcd(y, x)
if2(true, x, y) → gcd(minus(x, y), y)
if2(false, x, y) → x
gt(0, y) → false
gt(s(x), 0) → true
gt(s(x), s(y)) → gt(x, y)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(x, y) → IF1(ge(x, y), x, y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
IF1(false, x, y) → GCD(y, x)
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
gcd(x0, x1)
if1(true, x0, x1)
if1(false, x0, x1)
if2(true, x0, x1)
if2(false, x0, x1)
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(x, y) → IF1(ge(x, y), x, y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
IF1(false, x, y) → GCD(y, x)
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
(1) (IF2(gt(x5, 0), x4, x5)=IF2(true, x6, x7) ⇒ IF2(true, x6, x7)≥GCD(minus(x6, x7), x7))
(2) (0=x42∧gt(x5, x42)=true ⇒ IF2(true, x4, x5)≥GCD(minus(x4, x5), x5))
(3) (true=true∧0=0 ⇒ IF2(true, x4, s(x44))≥GCD(minus(x4, s(x44)), s(x44)))
(4) (gt(x46, x45)=true∧0=s(x45)∧(∀x47:gt(x46, x45)=true∧0=x45 ⇒ IF2(true, x47, x46)≥GCD(minus(x47, x46), x46)) ⇒ IF2(true, x4, s(x46))≥GCD(minus(x4, s(x46)), s(x46)))
(5) (IF2(true, x4, s(x44))≥GCD(minus(x4, s(x44)), s(x44)))
(6) (GCD(minus(x10, x11), x11)=GCD(x12, x13) ⇒ GCD(x12, x13)≥IF1(ge(x12, x13), x12, x13))
(7) (GCD(x12, x11)≥IF1(ge(x12, x11), x12, x11))
(8) (GCD(x19, x18)=GCD(x20, x21) ⇒ GCD(x20, x21)≥IF1(ge(x20, x21), x20, x21))
(9) (GCD(x19, x18)≥IF1(ge(x19, x18), x19, x18))
(10) (IF1(ge(x24, x25), x24, x25)=IF1(true, x26, x27) ⇒ IF1(true, x26, x27)≥IF2(gt(x27, 0), x26, x27))
(11) (ge(x24, x25)=true ⇒ IF1(true, x24, x25)≥IF2(gt(x25, 0), x24, x25))
(12) (true=true ⇒ IF1(true, x48, 0)≥IF2(gt(0, 0), x48, 0))
(13) (ge(x51, x50)=true∧(ge(x51, x50)=true ⇒ IF1(true, x51, x50)≥IF2(gt(x50, 0), x51, x50)) ⇒ IF1(true, s(x51), s(x50))≥IF2(gt(s(x50), 0), s(x51), s(x50)))
(14) (IF1(true, x48, 0)≥IF2(gt(0, 0), x48, 0))
(15) (IF1(true, x51, x50)≥IF2(gt(x50, 0), x51, x50) ⇒ IF1(true, s(x51), s(x50))≥IF2(gt(s(x50), 0), s(x51), s(x50)))
(16) (IF1(ge(x34, x35), x34, x35)=IF1(false, x36, x37) ⇒ IF1(false, x36, x37)≥GCD(x37, x36))
(17) (ge(x34, x35)=false ⇒ IF1(false, x34, x35)≥GCD(x35, x34))
(18) (false=false ⇒ IF1(false, 0, s(x53))≥GCD(s(x53), 0))
(19) (ge(x55, x54)=false∧(ge(x55, x54)=false ⇒ IF1(false, x55, x54)≥GCD(x54, x55)) ⇒ IF1(false, s(x55), s(x54))≥GCD(s(x54), s(x55)))
(20) (IF1(false, 0, s(x53))≥GCD(s(x53), 0))
(21) (IF1(false, x55, x54)≥GCD(x54, x55) ⇒ IF1(false, s(x55), s(x54))≥GCD(s(x54), s(x55)))
POL(0) = 0
POL(GCD(x1, x2)) = -1 + x2
POL(IF1(x1, x2, x3)) = -1 - x1 + x3
POL(IF2(x1, x2, x3)) = -1 - x1 + x3
POL(c) = -1
POL(false) = 0
POL(ge(x1, x2)) = 0
POL(gt(x1, x2)) = 0
POL(if(x1, x2, x3)) = 0
POL(minus(x1, x2)) = 0
POL(s(x1)) = 1 + x1
POL(true) = 0
The following pairs are in Pbound:
IF1(false, x, y) → GCD(y, x)
The following rules are usable:
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(x, y) → IF1(ge(x, y), x, y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
IF1(false, x, y) → GCD(y, x)
true → ge(x, 0)
false → ge(0, s(x))
ge(x, y) → ge(s(x), s(y))
false → gt(0, y)
true → gt(s(x), 0)
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(x, y) → IF1(ge(x, y), x, y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GCD(x0, 0) → IF1(true, x0, 0)
GCD(0, s(x0)) → IF1(false, 0, s(x0))
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF2(true, x, y) → GCD(minus(x, y), y)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
GCD(x0, 0) → IF1(true, x0, 0)
GCD(0, s(x0)) → IF1(false, 0, s(x0))
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GCD(x0, 0) → IF1(true, x0, 0)
IF1(true, x, y) → IF2(gt(y, 0), x, y)
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF1(true, y0, 0) → IF2(false, y0, 0)
IF1(true, y0, s(x0)) → IF2(true, y0, s(x0))
GCD(x0, 0) → IF1(true, x0, 0)
IF2(true, x, y) → GCD(minus(x, y), y)
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF1(true, y0, 0) → IF2(false, y0, 0)
IF1(true, y0, s(x0)) → IF2(true, y0, s(x0))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF1(true, y0, s(x0)) → IF2(true, y0, s(x0))
IF2(true, x, y) → GCD(minus(x, y), y)
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF2(true, s(x0), x1) → GCD(if(gt(s(x0), x1), x0, x1), x1)
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF1(true, y0, s(x0)) → IF2(true, y0, s(x0))
IF2(true, s(x0), x1) → GCD(if(gt(s(x0), x1), x0, x1), x1)
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF1(true, s(z0), s(z1)) → IF2(true, s(z0), s(z1))
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF2(true, s(x0), x1) → GCD(if(gt(s(x0), x1), x0, x1), x1)
IF1(true, s(z0), s(z1)) → IF2(true, s(z0), s(z1))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF2(true, s(z0), s(z1)) → GCD(if(gt(s(z0), s(z1)), z0, s(z1)), s(z1))
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF1(true, s(z0), s(z1)) → IF2(true, s(z0), s(z1))
IF2(true, s(z0), s(z1)) → GCD(if(gt(s(z0), s(z1)), z0, s(z1)), s(z1))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
IF2(true, s(z0), s(z1)) → GCD(if(gt(z0, z1), z0, s(z1)), s(z1))
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF1(true, s(z0), s(z1)) → IF2(true, s(z0), s(z1))
IF2(true, s(z0), s(z1)) → GCD(if(gt(z0, z1), z0, s(z1)), s(z1))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
POL(0) = 0
POL(GCD(x1, x2)) = x1
POL(IF1(x1, x2, x3)) = x2
POL(IF2(x1, x2, x3)) = x2
POL(false) = 1
POL(ge(x1, x2)) = 1 + x1 + x2
POL(gt(x1, x2)) = 1
POL(if(x1, x2, x3)) = x1 + x2
POL(minus(x1, x2)) = x1
POL(s(x1)) = 1 + x1
POL(true) = 1
[x, x0, x1, x68, y50, x41, y43, y29, y, x5, x50, y36, x14, x23, x32, y22] 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[a23](0, 0) -> true equal_sort[a23](0, s(x0)) -> false equal_sort[a23](s(x0), 0) -> false equal_sort[a23](s(x0), s(x1)) -> equal_sort[a23](x0, x1) equal_sort[a40](witness_sort[a40], witness_sort[a40]) -> true if'(false, x68, y50) -> true if'(true, s(x41), y43) -> if'(gt(s(x41), y43), x41, y43) if'(true, 0, y43) -> false minus'(0, x1) -> false equal_bool(gt(s(x41), y29), true) -> true | minus'(s(x41), y29) -> minus'(x41, y29) equal_bool(gt(s(x41), y29), true) -> false | minus'(s(x41), y29) -> true gt(0, y) -> false gt(s(x5), 0) -> true gt(s(x50), s(y36)) -> gt(x50, y36) ge(x14, 0) -> true ge(0, s(x23)) -> false ge(s(x32), s(y22)) -> ge(x32, y22) if(false, x68, y50) -> 0 if(true, s(x41), y43) -> s(if(gt(s(x41), y43), x41, y43)) if(true, 0, y43) -> s(0) minus(0, x1) -> 0 equal_bool(gt(s(x41), y29), true) -> true | minus(s(x41), y29) -> s(minus(x41, y29)) equal_bool(gt(s(x41), y29), true) -> false | minus(s(x41), y29) -> 0
proof of internal # AProVE Commit ID: 9a00b172b26c9abb2d4c4d5eaf341e919eb0fbf1 nowonder 20100222 unpublished dirty Partial correctness of the following Program [x, x0, x1, x68, y50, x41, y43, y29, y, x5, x50, y36, x14, x23, x32, y22] 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[a23](0, 0) -> true equal_sort[a23](0, s(x0)) -> false equal_sort[a23](s(x0), 0) -> false equal_sort[a23](s(x0), s(x1)) -> equal_sort[a23](x0, x1) equal_sort[a40](witness_sort[a40], witness_sort[a40]) -> true if'(false, x68, y50) -> true if'(true, s(x41), y43) -> if'(gt(s(x41), y43), x41, y43) if'(true, 0, y43) -> false minus'(0, x1) -> false equal_bool(gt(s(x41), y29), true) -> true | minus'(s(x41), y29) -> minus'(x41, y29) equal_bool(gt(s(x41), y29), true) -> false | minus'(s(x41), y29) -> true gt(0, y) -> false gt(s(x5), 0) -> true gt(s(x50), s(y36)) -> gt(x50, y36) ge(x14, 0) -> true ge(0, s(x23)) -> false ge(s(x32), s(y22)) -> ge(x32, y22) if(false, x68, y50) -> 0 if(true, s(x41), y43) -> s(if(gt(s(x41), y43), x41, y43)) if(true, 0, y43) -> s(0) minus(0, x1) -> 0 equal_bool(gt(s(x41), y29), true) -> true | minus(s(x41), y29) -> s(minus(x41, y29)) equal_bool(gt(s(x41), y29), true) -> false | minus(s(x41), y29) -> 0 using the following formula: z0':sort[a23],z1':sort[a23].if'(gt(z0', z1'), z0', s(z1'))=true could be successfully shown: (0) Formula (1) Induction by algorithm [EQUIVALENT] (2) AND (3) Formula (4) Symbolic evaluation [EQUIVALENT] (5) YES (6) Formula (7) Symbolic evaluation [EQUIVALENT] (8) Formula (9) Induction by data structure [EQUIVALENT] (10) AND (11) Formula (12) Symbolic evaluation [EQUIVALENT] (13) YES (14) Formula (15) Symbolic evaluation under hypothesis [EQUIVALENT] (16) YES (17) Formula (18) Symbolic evaluation [EQUIVALENT] (19) Formula (20) Hypothesis Lifting [EQUIVALENT] (21) Formula (22) Inverse Substitution [SOUND] (23) Formula (24) Inverse Substitution [SOUND] (25) Formula (26) Induction by algorithm [EQUIVALENT] (27) AND (28) Formula (29) Symbolic evaluation [EQUIVALENT] (30) YES (31) Formula (32) Symbolic evaluation [EQUIVALENT] (33) YES (34) Formula (35) Symbolic evaluation under hypothesis [EQUIVALENT] (36) YES ---------------------------------------- (0) Obligation: Formula: z0':sort[a23],z1':sort[a23].if'(gt(z0', z1'), z0', s(z1'))=true There are no hypotheses. ---------------------------------------- (1) Induction by algorithm (EQUIVALENT) Induction by algorithm gt(z0', z1') generates the following cases: 1. Base Case: Formula: y:sort[a23].if'(gt(0, y), 0, s(y))=true There are no hypotheses. 2. Base Case: Formula: x5:sort[a23].if'(gt(s(x5), 0), s(x5), s(0))=true There are no hypotheses. 1. Step Case: Formula: x50:sort[a23],y36:sort[a23].if'(gt(s(x50), s(y36)), s(x50), s(s(y36)))=true Hypotheses: x50:sort[a23],y36:sort[a23].if'(gt(x50, y36), x50, s(y36))=true ---------------------------------------- (2) Complex Obligation (AND) ---------------------------------------- (3) Obligation: Formula: y:sort[a23].if'(gt(0, y), 0, s(y))=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: x5:sort[a23].if'(gt(s(x5), 0), s(x5), s(0))=true There are no hypotheses. ---------------------------------------- (7) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: x5:sort[a23].if'(gt(x5, 0), x5, s(0))=true ---------------------------------------- (8) Obligation: Formula: x5:sort[a23].if'(gt(x5, 0), x5, s(0))=true There are no hypotheses. ---------------------------------------- (9) Induction by data structure (EQUIVALENT) Induction by data structure sort[a23] generates the following cases: 1. Base Case: Formula: if'(gt(0, 0), 0, s(0))=true There are no hypotheses. 1. Step Case: Formula: n:sort[a23].if'(gt(s(n), 0), s(n), s(0))=true Hypotheses: n:sort[a23].if'(gt(n, 0), n, s(0))=true ---------------------------------------- (10) Complex Obligation (AND) ---------------------------------------- (11) Obligation: Formula: if'(gt(0, 0), 0, s(0))=true There are no hypotheses. ---------------------------------------- (12) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: True ---------------------------------------- (13) YES ---------------------------------------- (14) Obligation: Formula: n:sort[a23].if'(gt(s(n), 0), s(n), s(0))=true Hypotheses: n:sort[a23].if'(gt(n, 0), n, s(0))=true ---------------------------------------- (15) Symbolic evaluation under hypothesis (EQUIVALENT) Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses: n:sort[a23].if'(gt(n, 0), n, s(0))=true ---------------------------------------- (16) YES ---------------------------------------- (17) Obligation: Formula: x50:sort[a23],y36:sort[a23].if'(gt(s(x50), s(y36)), s(x50), s(s(y36)))=true Hypotheses: x50:sort[a23],y36:sort[a23].if'(gt(x50, y36), x50, s(y36))=true ---------------------------------------- (18) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: x50:sort[a23],y36:sort[a23].if'(gt(x50, y36), s(x50), s(s(y36)))=true ---------------------------------------- (19) Obligation: Formula: x50:sort[a23],y36:sort[a23].if'(gt(x50, y36), s(x50), s(s(y36)))=true Hypotheses: x50:sort[a23],y36:sort[a23].if'(gt(x50, y36), x50, s(y36))=true ---------------------------------------- (20) Hypothesis Lifting (EQUIVALENT) Formula could be generalised by hypothesis lifting to the following new obligation: Formula: x50:sort[a23],y36:sort[a23].(if'(gt(x50, y36), x50, s(y36))=true->if'(gt(x50, y36), s(x50), s(s(y36)))=true) There are no hypotheses. ---------------------------------------- (21) Obligation: Formula: x50:sort[a23],y36:sort[a23].(if'(gt(x50, y36), x50, s(y36))=true->if'(gt(x50, y36), s(x50), s(s(y36)))=true) There are no hypotheses. ---------------------------------------- (22) Inverse Substitution (SOUND) The formula could be generalised by inverse substitution to: n:bool,x50:sort[a23],y36:sort[a23].(if'(n, x50, s(y36))=true->if'(n, s(x50), s(s(y36)))=true) Inverse substitution used: [gt(x50, y36)/n] ---------------------------------------- (23) Obligation: Formula: n:bool,x50:sort[a23],y36:sort[a23].(if'(n, x50, s(y36))=true->if'(n, s(x50), s(s(y36)))=true) There are no hypotheses. ---------------------------------------- (24) Inverse Substitution (SOUND) The formula could be generalised by inverse substitution to: n:bool,x50:sort[a23],n':sort[a23].(if'(n, x50, n')=true->if'(n, s(x50), s(n'))=true) Inverse substitution used: [s(y36)/n'] ---------------------------------------- (25) Obligation: Formula: n:bool,x50:sort[a23],n':sort[a23].(if'(n, x50, n')=true->if'(n, s(x50), s(n'))=true) There are no hypotheses. ---------------------------------------- (26) Induction by algorithm (EQUIVALENT) Induction by algorithm if'(n, x50, n') generates the following cases: 1. Base Case: Formula: x68:sort[a23],y50:sort[a23].(if'(false, x68, y50)=true->if'(false, s(x68), s(y50))=true) There are no hypotheses. 2. Base Case: Formula: y43:sort[a23].(if'(true, 0, y43)=true->if'(true, s(0), s(y43))=true) There are no hypotheses. 1. Step Case: Formula: x41:sort[a23],y43:sort[a23].(if'(true, s(x41), y43)=true->if'(true, s(s(x41)), s(y43))=true) Hypotheses: x41:sort[a23],y43:sort[a23].(if'(gt(s(x41), y43), x41, y43)=true->if'(gt(s(x41), y43), s(x41), s(y43))=true) ---------------------------------------- (27) Complex Obligation (AND) ---------------------------------------- (28) Obligation: Formula: x68:sort[a23],y50:sort[a23].(if'(false, x68, y50)=true->if'(false, s(x68), s(y50))=true) There are no hypotheses. ---------------------------------------- (29) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: True ---------------------------------------- (30) YES ---------------------------------------- (31) Obligation: Formula: y43:sort[a23].(if'(true, 0, y43)=true->if'(true, s(0), s(y43))=true) There are no hypotheses. ---------------------------------------- (32) Symbolic evaluation (EQUIVALENT) Could be reduced to the following new obligation by simple symbolic evaluation: True ---------------------------------------- (33) YES ---------------------------------------- (34) Obligation: Formula: x41:sort[a23],y43:sort[a23].(if'(true, s(x41), y43)=true->if'(true, s(s(x41)), s(y43))=true) Hypotheses: x41:sort[a23],y43:sort[a23].(if'(gt(s(x41), y43), x41, y43)=true->if'(gt(s(x41), y43), s(x41), s(y43))=true) ---------------------------------------- (35) Symbolic evaluation under hypothesis (EQUIVALENT) Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses: x41:sort[a23],y43:sort[a23].(if'(gt(s(x41), y43), x41, y43)=true->if'(gt(s(x41), y43), s(x41), s(y43))=true) ---------------------------------------- (36) YES
GCD(s(x0), s(x1)) → IF1(ge(x0, x1), s(x0), s(x1))
IF1(true, s(z0), s(z1)) → IF2(true, s(z0), s(z1))
gt(0, y) → false
gt(s(x), 0) → true
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
minus(s(x), y) → if(gt(s(x), y), x, y)
gt(s(x), s(y)) → gt(x, y)
if(true, x, y) → s(minus(x, y))
if(false, x, y) → 0
minus(s(x0), x1)
if(true, x0, x1)
if(false, x0, x1)
gt(0, x0)
gt(s(x0), 0)
gt(s(x0), s(x1))
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
minus'(s(x41), y29) → if'(gt(s(x41), y29), x41, y29)
if'(true, x59, y43) → minus'(x59, y43)
if'(false, x68, y50) → true
minus'(0, x1) → false
gt(0, y) → false
gt(s(x5), 0) → true
ge(x14, 0) → true
ge(0, s(x23)) → false
ge(s(x32), s(y22)) → ge(x32, y22)
minus(s(x41), y29) → if(gt(s(x41), y29), x41, y29)
gt(s(x50), s(y36)) → gt(x50, y36)
if(true, x59, y43) → s(minus(x59, y43))
if(false, x68, y50) → 0
minus(0, x1) → 0
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[a23](0, 0) → true
equal_sort[a23](0, s(x0)) → false
equal_sort[a23](s(x0), 0) → false
equal_sort[a23](s(x0), s(x1)) → equal_sort[a23](x0, x1)
equal_sort[a40](witness_sort[a40], witness_sort[a40]) → true
and2 > [minus'2, if'3, false, 0] > [true, ge2, equalbool2] > [minus2, if3] > [s1, gt2, equalsort[a23]2]
or2 > [true, ge2, equalbool2] > [minus2, if3] > [s1, gt2, equalsort[a23]2]
not1 > [minus'2, if'3, false, 0] > [true, ge2, equalbool2] > [minus2, if3] > [s1, gt2, equalsort[a23]2]
isafalse1 > [minus'2, if'3, false, 0] > [true, ge2, equalbool2] > [minus2, if3] > [s1, gt2, equalsort[a23]2]
equalsort[a40]2 > [true, ge2, equalbool2] > [minus2, if3] > [s1, gt2, equalsort[a23]2]
minus'2: [2,1]
s1: multiset
if'3: [3,2,1]
gt2: [1,2]
true: multiset
false: multiset
0: multiset
ge2: [2,1]
minus2: [1,2]
if3: [2,3,1]
equalbool2: multiset
and2: [1,2]
or2: [2,1]
not1: [1]
isafalse1: [1]
equalsort[a23]2: multiset
equalsort[a40]2: multiset
witnesssort[a40]: multiset
minus'(s(x41), y29) → if'(gt(s(x41), y29), x41, y29)
if'(true, x59, y43) → minus'(x59, y43)
if'(false, x68, y50) → true
minus'(0, x1) → false
gt(0, y) → false
gt(s(x5), 0) → true
ge(x14, 0) → true
ge(0, s(x23)) → false
ge(s(x32), s(y22)) → ge(x32, y22)
minus(s(x41), y29) → if(gt(s(x41), y29), x41, y29)
gt(s(x50), s(y36)) → gt(x50, y36)
if(true, x59, y43) → s(minus(x59, y43))
if(false, x68, y50) → 0
minus(0, x1) → 0
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[a23](0, 0) → true
equal_sort[a23](0, s(x0)) → false
equal_sort[a23](s(x0), 0) → false
equal_sort[a23](s(x0), s(x1)) → equal_sort[a23](x0, x1)
equal_sort[a40](witness_sort[a40], witness_sort[a40]) → true
isa_true(true) → true
isa_true(false) → false
With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:
POL(false) = 1
POL(isa_true(x1)) = 2 + 2·x1
POL(true) = 1
isa_true(true) → true
isa_true(false) → false