Term Rewriting System R:
[X, Y, X1, X2, X3]
afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false

Termination of R to be shown.



   R
Dependency Pair Analysis



R contains the following Dependency Pairs:

AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
AFACT(X) -> AZERO(mark(X))
AFACT(X) -> MARK(X)
AADD(0, X) -> MARK(X)
AADD(s(X), Y) -> AADD(mark(X), mark(Y))
AADD(s(X), Y) -> MARK(X)
AADD(s(X), Y) -> MARK(Y)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
APROD(s(X), Y) -> MARK(Y)
APROD(s(X), Y) -> APROD(mark(X), mark(Y))
APROD(s(X), Y) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AIF(false, X, Y) -> MARK(Y)
AP(s(X)) -> MARK(X)
MARK(fact(X)) -> AFACT(mark(X))
MARK(fact(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> AIF(mark(X1), X2, X3)
MARK(if(X1, X2, X3)) -> MARK(X1)
MARK(zero(X)) -> AZERO(mark(X))
MARK(zero(X)) -> MARK(X)
MARK(prod(X1, X2)) -> APROD(mark(X1), mark(X2))
MARK(prod(X1, X2)) -> MARK(X1)
MARK(prod(X1, X2)) -> MARK(X2)
MARK(p(X)) -> AP(mark(X))
MARK(p(X)) -> MARK(X)
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(add(X1, X2)) -> MARK(X1)
MARK(add(X1, X2)) -> MARK(X2)
MARK(s(X)) -> MARK(X)

Furthermore, R contains one SCC.


   R
DPs
       →DP Problem 1
Narrowing Transformation


Dependency Pairs:

APROD(s(X), Y) -> MARK(X)
APROD(s(X), Y) -> APROD(mark(X), mark(Y))
APROD(s(X), Y) -> MARK(Y)
AADD(s(X), Y) -> MARK(Y)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
AADD(s(X), Y) -> MARK(X)
AADD(s(X), Y) -> AADD(mark(X), mark(Y))
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(p(X)) -> MARK(X)
AP(s(X)) -> MARK(X)
MARK(p(X)) -> AP(mark(X))
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
AADD(0, X) -> MARK(X)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
MARK(prod(X1, X2)) -> APROD(mark(X1), mark(X2))
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
AIF(false, X, Y) -> MARK(Y)
MARK(if(X1, X2, X3)) -> AIF(mark(X1), X2, X3)
MARK(fact(X)) -> MARK(X)
AFACT(X) -> MARK(X)
MARK(fact(X)) -> AFACT(mark(X))
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false





On this DP problem, a Narrowing SCC transformation can be performed.
As a result of transforming the rule

AADD(s(X), Y) -> AADD(mark(X), mark(Y))
20 new Dependency Pairs are created:

AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(true), Y) -> AADD(true, mark(Y))
AADD(s(false), Y) -> AADD(false, mark(Y))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), false) -> AADD(mark(X), false)

The transformation is resulting in one new DP problem:



   R
DPs
       →DP Problem 1
Nar
           →DP Problem 2
Narrowing Transformation


Dependency Pairs:

AFACT(X) -> MARK(X)
APROD(s(X), Y) -> APROD(mark(X), mark(Y))
APROD(s(X), Y) -> MARK(Y)
AADD(s(X), false) -> AADD(mark(X), false)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
AADD(s(X), Y) -> MARK(Y)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
AADD(s(X), Y) -> MARK(X)
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(p(X)) -> MARK(X)
AP(s(X)) -> MARK(X)
MARK(p(X)) -> AP(mark(X))
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
AADD(0, X) -> MARK(X)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
MARK(prod(X1, X2)) -> APROD(mark(X1), mark(X2))
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
AIF(false, X, Y) -> MARK(Y)
MARK(if(X1, X2, X3)) -> AIF(mark(X1), X2, X3)
MARK(fact(X)) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
MARK(fact(X)) -> AFACT(mark(X))
APROD(s(X), Y) -> MARK(X)


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false





On this DP problem, a Narrowing SCC transformation can be performed.
As a result of transforming the rule

APROD(s(X), Y) -> APROD(mark(X), mark(Y))
20 new Dependency Pairs are created:

APROD(s(fact(X'')), Y) -> APROD(afact(mark(X'')), mark(Y))
APROD(s(if(X1', X2', X3')), Y) -> APROD(aif(mark(X1'), X2', X3'), mark(Y))
APROD(s(zero(X'')), Y) -> APROD(azero(mark(X'')), mark(Y))
APROD(s(prod(X1', X2')), Y) -> APROD(aprod(mark(X1'), mark(X2')), mark(Y))
APROD(s(p(X'')), Y) -> APROD(ap(mark(X'')), mark(Y))
APROD(s(add(X1', X2')), Y) -> APROD(aadd(mark(X1'), mark(X2')), mark(Y))
APROD(s(s(X'')), Y) -> APROD(s(mark(X'')), mark(Y))
APROD(s(0), Y) -> APROD(0, mark(Y))
APROD(s(true), Y) -> APROD(true, mark(Y))
APROD(s(false), Y) -> APROD(false, mark(Y))
APROD(s(X), fact(X'')) -> APROD(mark(X), afact(mark(X'')))
APROD(s(X), if(X1', X2', X3')) -> APROD(mark(X), aif(mark(X1'), X2', X3'))
APROD(s(X), zero(X'')) -> APROD(mark(X), azero(mark(X'')))
APROD(s(X), prod(X1', X2')) -> APROD(mark(X), aprod(mark(X1'), mark(X2')))
APROD(s(X), p(X'')) -> APROD(mark(X), ap(mark(X'')))
APROD(s(X), add(X1', X2')) -> APROD(mark(X), aadd(mark(X1'), mark(X2')))
APROD(s(X), s(X'')) -> APROD(mark(X), s(mark(X'')))
APROD(s(X), 0) -> APROD(mark(X), 0)
APROD(s(X), true) -> APROD(mark(X), true)
APROD(s(X), false) -> APROD(mark(X), false)

The transformation is resulting in one new DP problem:



   R
DPs
       →DP Problem 1
Nar
           →DP Problem 2
Nar
             ...
               →DP Problem 3
Narrowing Transformation


Dependency Pairs:

APROD(s(X), false) -> APROD(mark(X), false)
APROD(s(X), true) -> APROD(mark(X), true)
APROD(s(X), 0) -> APROD(mark(X), 0)
APROD(s(X), s(X'')) -> APROD(mark(X), s(mark(X'')))
APROD(s(X), add(X1', X2')) -> APROD(mark(X), aadd(mark(X1'), mark(X2')))
APROD(s(X), p(X'')) -> APROD(mark(X), ap(mark(X'')))
APROD(s(X), prod(X1', X2')) -> APROD(mark(X), aprod(mark(X1'), mark(X2')))
APROD(s(X), zero(X'')) -> APROD(mark(X), azero(mark(X'')))
APROD(s(X), if(X1', X2', X3')) -> APROD(mark(X), aif(mark(X1'), X2', X3'))
APROD(s(X), fact(X'')) -> APROD(mark(X), afact(mark(X'')))
APROD(s(s(X'')), Y) -> APROD(s(mark(X'')), mark(Y))
APROD(s(add(X1', X2')), Y) -> APROD(aadd(mark(X1'), mark(X2')), mark(Y))
APROD(s(p(X'')), Y) -> APROD(ap(mark(X'')), mark(Y))
APROD(s(prod(X1', X2')), Y) -> APROD(aprod(mark(X1'), mark(X2')), mark(Y))
APROD(s(zero(X'')), Y) -> APROD(azero(mark(X'')), mark(Y))
APROD(s(if(X1', X2', X3')), Y) -> APROD(aif(mark(X1'), X2', X3'), mark(Y))
APROD(s(fact(X'')), Y) -> APROD(afact(mark(X'')), mark(Y))
APROD(s(X), Y) -> MARK(X)
APROD(s(X), Y) -> MARK(Y)
AADD(s(X), false) -> AADD(mark(X), false)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
AADD(s(X), Y) -> MARK(Y)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
AADD(s(X), Y) -> MARK(X)
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(p(X)) -> MARK(X)
AP(s(X)) -> MARK(X)
MARK(p(X)) -> AP(mark(X))
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
AADD(0, X) -> MARK(X)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
MARK(prod(X1, X2)) -> APROD(mark(X1), mark(X2))
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
AIF(false, X, Y) -> MARK(Y)
MARK(if(X1, X2, X3)) -> AIF(mark(X1), X2, X3)
MARK(fact(X)) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
MARK(fact(X)) -> AFACT(mark(X))
AFACT(X) -> MARK(X)


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false





On this DP problem, a Narrowing SCC transformation can be performed.
As a result of transforming the rule

MARK(if(X1, X2, X3)) -> AIF(mark(X1), X2, X3)
10 new Dependency Pairs are created:

MARK(if(fact(X'), X2, X3)) -> AIF(afact(mark(X')), X2, X3)
MARK(if(if(X1'', X2'', X3''), X2, X3)) -> AIF(aif(mark(X1''), X2'', X3''), X2, X3)
MARK(if(zero(X'), X2, X3)) -> AIF(azero(mark(X')), X2, X3)
MARK(if(prod(X1'', X2''), X2, X3)) -> AIF(aprod(mark(X1''), mark(X2'')), X2, X3)
MARK(if(p(X'), X2, X3)) -> AIF(ap(mark(X')), X2, X3)
MARK(if(add(X1'', X2''), X2, X3)) -> AIF(aadd(mark(X1''), mark(X2'')), X2, X3)
MARK(if(s(X'), X2, X3)) -> AIF(s(mark(X')), X2, X3)
MARK(if(0, X2, X3)) -> AIF(0, X2, X3)
MARK(if(true, X2, X3)) -> AIF(true, X2, X3)
MARK(if(false, X2, X3)) -> AIF(false, X2, X3)

The transformation is resulting in one new DP problem:



   R
DPs
       →DP Problem 1
Nar
           →DP Problem 2
Nar
             ...
               →DP Problem 4
Narrowing Transformation


Dependency Pairs:

AFACT(X) -> MARK(X)
APROD(s(X), true) -> APROD(mark(X), true)
APROD(s(X), 0) -> APROD(mark(X), 0)
APROD(s(X), s(X'')) -> APROD(mark(X), s(mark(X'')))
APROD(s(X), add(X1', X2')) -> APROD(mark(X), aadd(mark(X1'), mark(X2')))
APROD(s(X), p(X'')) -> APROD(mark(X), ap(mark(X'')))
APROD(s(X), prod(X1', X2')) -> APROD(mark(X), aprod(mark(X1'), mark(X2')))
APROD(s(X), zero(X'')) -> APROD(mark(X), azero(mark(X'')))
APROD(s(X), if(X1', X2', X3')) -> APROD(mark(X), aif(mark(X1'), X2', X3'))
APROD(s(X), fact(X'')) -> APROD(mark(X), afact(mark(X'')))
APROD(s(s(X'')), Y) -> APROD(s(mark(X'')), mark(Y))
APROD(s(add(X1', X2')), Y) -> APROD(aadd(mark(X1'), mark(X2')), mark(Y))
APROD(s(p(X'')), Y) -> APROD(ap(mark(X'')), mark(Y))
APROD(s(prod(X1', X2')), Y) -> APROD(aprod(mark(X1'), mark(X2')), mark(Y))
APROD(s(zero(X'')), Y) -> APROD(azero(mark(X'')), mark(Y))
APROD(s(if(X1', X2', X3')), Y) -> APROD(aif(mark(X1'), X2', X3'), mark(Y))
APROD(s(fact(X'')), Y) -> APROD(afact(mark(X'')), mark(Y))
APROD(s(X), Y) -> MARK(X)
AADD(s(X), false) -> AADD(mark(X), false)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
AADD(s(X), Y) -> MARK(Y)
MARK(if(false, X2, X3)) -> AIF(false, X2, X3)
MARK(if(true, X2, X3)) -> AIF(true, X2, X3)
MARK(if(add(X1'', X2''), X2, X3)) -> AIF(aadd(mark(X1''), mark(X2'')), X2, X3)
MARK(if(p(X'), X2, X3)) -> AIF(ap(mark(X')), X2, X3)
MARK(if(prod(X1'', X2''), X2, X3)) -> AIF(aprod(mark(X1''), mark(X2'')), X2, X3)
MARK(if(zero(X'), X2, X3)) -> AIF(azero(mark(X')), X2, X3)
MARK(if(if(X1'', X2'', X3''), X2, X3)) -> AIF(aif(mark(X1''), X2'', X3''), X2, X3)
AIF(false, X, Y) -> MARK(Y)
MARK(if(fact(X'), X2, X3)) -> AIF(afact(mark(X')), X2, X3)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
AADD(s(X), Y) -> MARK(X)
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(p(X)) -> MARK(X)
AP(s(X)) -> MARK(X)
MARK(p(X)) -> AP(mark(X))
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
APROD(s(X), Y) -> MARK(Y)
MARK(prod(X1, X2)) -> APROD(mark(X1), mark(X2))
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
MARK(fact(X)) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
MARK(fact(X)) -> AFACT(mark(X))
AADD(0, X) -> MARK(X)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
APROD(s(X), false) -> APROD(mark(X), false)


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false





On this DP problem, a Narrowing SCC transformation can be performed.
As a result of transforming the rule

MARK(prod(X1, X2)) -> APROD(mark(X1), mark(X2))
20 new Dependency Pairs are created:

MARK(prod(fact(X'), X2)) -> APROD(afact(mark(X')), mark(X2))
MARK(prod(if(X1'', X2'', X3'), X2)) -> APROD(aif(mark(X1''), X2'', X3'), mark(X2))
MARK(prod(zero(X'), X2)) -> APROD(azero(mark(X')), mark(X2))
MARK(prod(prod(X1'', X2''), X2)) -> APROD(aprod(mark(X1''), mark(X2'')), mark(X2))
MARK(prod(p(X'), X2)) -> APROD(ap(mark(X')), mark(X2))
MARK(prod(add(X1'', X2''), X2)) -> APROD(aadd(mark(X1''), mark(X2'')), mark(X2))
MARK(prod(s(X'), X2)) -> APROD(s(mark(X')), mark(X2))
MARK(prod(0, X2)) -> APROD(0, mark(X2))
MARK(prod(true, X2)) -> APROD(true, mark(X2))
MARK(prod(false, X2)) -> APROD(false, mark(X2))
MARK(prod(X1, fact(X'))) -> APROD(mark(X1), afact(mark(X')))
MARK(prod(X1, if(X1'', X2'', X3'))) -> APROD(mark(X1), aif(mark(X1''), X2'', X3'))
MARK(prod(X1, zero(X'))) -> APROD(mark(X1), azero(mark(X')))
MARK(prod(X1, prod(X1'', X2''))) -> APROD(mark(X1), aprod(mark(X1''), mark(X2'')))
MARK(prod(X1, p(X'))) -> APROD(mark(X1), ap(mark(X')))
MARK(prod(X1, add(X1'', X2''))) -> APROD(mark(X1), aadd(mark(X1''), mark(X2'')))
MARK(prod(X1, s(X'))) -> APROD(mark(X1), s(mark(X')))
MARK(prod(X1, 0)) -> APROD(mark(X1), 0)
MARK(prod(X1, true)) -> APROD(mark(X1), true)
MARK(prod(X1, false)) -> APROD(mark(X1), false)

The transformation is resulting in one new DP problem:



   R
DPs
       →DP Problem 1
Nar
           →DP Problem 2
Nar
             ...
               →DP Problem 5
Narrowing Transformation


Dependency Pairs:

AADD(s(X), false) -> AADD(mark(X), false)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
AADD(s(X), Y) -> MARK(Y)
MARK(prod(X1, false)) -> APROD(mark(X1), false)
MARK(prod(X1, true)) -> APROD(mark(X1), true)
MARK(prod(X1, 0)) -> APROD(mark(X1), 0)
MARK(prod(X1, s(X'))) -> APROD(mark(X1), s(mark(X')))
MARK(prod(X1, add(X1'', X2''))) -> APROD(mark(X1), aadd(mark(X1''), mark(X2'')))
MARK(prod(X1, p(X'))) -> APROD(mark(X1), ap(mark(X')))
MARK(prod(X1, prod(X1'', X2''))) -> APROD(mark(X1), aprod(mark(X1''), mark(X2'')))
MARK(prod(X1, zero(X'))) -> APROD(mark(X1), azero(mark(X')))
MARK(prod(X1, if(X1'', X2'', X3'))) -> APROD(mark(X1), aif(mark(X1''), X2'', X3'))
MARK(prod(X1, fact(X'))) -> APROD(mark(X1), afact(mark(X')))
MARK(prod(s(X'), X2)) -> APROD(s(mark(X')), mark(X2))
MARK(prod(add(X1'', X2''), X2)) -> APROD(aadd(mark(X1''), mark(X2'')), mark(X2))
MARK(prod(p(X'), X2)) -> APROD(ap(mark(X')), mark(X2))
APROD(s(X), false) -> APROD(mark(X), false)
APROD(s(X), true) -> APROD(mark(X), true)
APROD(s(X), 0) -> APROD(mark(X), 0)
APROD(s(X), s(X'')) -> APROD(mark(X), s(mark(X'')))
APROD(s(X), add(X1', X2')) -> APROD(mark(X), aadd(mark(X1'), mark(X2')))
APROD(s(X), p(X'')) -> APROD(mark(X), ap(mark(X'')))
APROD(s(X), prod(X1', X2')) -> APROD(mark(X), aprod(mark(X1'), mark(X2')))
APROD(s(X), zero(X'')) -> APROD(mark(X), azero(mark(X'')))
APROD(s(X), if(X1', X2', X3')) -> APROD(mark(X), aif(mark(X1'), X2', X3'))
APROD(s(X), fact(X'')) -> APROD(mark(X), afact(mark(X'')))
APROD(s(s(X'')), Y) -> APROD(s(mark(X'')), mark(Y))
APROD(s(add(X1', X2')), Y) -> APROD(aadd(mark(X1'), mark(X2')), mark(Y))
APROD(s(p(X'')), Y) -> APROD(ap(mark(X'')), mark(Y))
APROD(s(prod(X1', X2')), Y) -> APROD(aprod(mark(X1'), mark(X2')), mark(Y))
APROD(s(zero(X'')), Y) -> APROD(azero(mark(X'')), mark(Y))
APROD(s(if(X1', X2', X3')), Y) -> APROD(aif(mark(X1'), X2', X3'), mark(Y))
APROD(s(fact(X'')), Y) -> APROD(afact(mark(X'')), mark(Y))
MARK(prod(prod(X1'', X2''), X2)) -> APROD(aprod(mark(X1''), mark(X2'')), mark(X2))
APROD(s(X), Y) -> MARK(X)
MARK(prod(zero(X'), X2)) -> APROD(azero(mark(X')), mark(X2))
APROD(s(X), Y) -> MARK(Y)
MARK(prod(if(X1'', X2'', X3'), X2)) -> APROD(aif(mark(X1''), X2'', X3'), mark(X2))
AADD(s(X), Y) -> MARK(X)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
MARK(prod(fact(X'), X2)) -> APROD(afact(mark(X')), mark(X2))
MARK(if(false, X2, X3)) -> AIF(false, X2, X3)
MARK(if(true, X2, X3)) -> AIF(true, X2, X3)
MARK(if(add(X1'', X2''), X2, X3)) -> AIF(aadd(mark(X1''), mark(X2'')), X2, X3)
MARK(if(p(X'), X2, X3)) -> AIF(ap(mark(X')), X2, X3)
MARK(if(prod(X1'', X2''), X2, X3)) -> AIF(aprod(mark(X1''), mark(X2'')), X2, X3)
MARK(if(zero(X'), X2, X3)) -> AIF(azero(mark(X')), X2, X3)
MARK(if(if(X1'', X2'', X3''), X2, X3)) -> AIF(aif(mark(X1''), X2'', X3''), X2, X3)
AIF(false, X, Y) -> MARK(Y)
MARK(if(fact(X'), X2, X3)) -> AIF(afact(mark(X')), X2, X3)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
AADD(0, X) -> MARK(X)
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(p(X)) -> MARK(X)
AP(s(X)) -> MARK(X)
MARK(p(X)) -> AP(mark(X))
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
MARK(fact(X)) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
MARK(fact(X)) -> AFACT(mark(X))
AFACT(X) -> MARK(X)


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false





On this DP problem, a Narrowing SCC transformation can be performed.
As a result of transforming the rule

MARK(p(X)) -> AP(mark(X))
10 new Dependency Pairs are created:

MARK(p(fact(X''))) -> AP(afact(mark(X'')))
MARK(p(if(X1', X2', X3'))) -> AP(aif(mark(X1'), X2', X3'))
MARK(p(zero(X''))) -> AP(azero(mark(X'')))
MARK(p(prod(X1', X2'))) -> AP(aprod(mark(X1'), mark(X2')))
MARK(p(p(X''))) -> AP(ap(mark(X'')))
MARK(p(add(X1', X2'))) -> AP(aadd(mark(X1'), mark(X2')))
MARK(p(s(X''))) -> AP(s(mark(X'')))
MARK(p(0)) -> AP(0)
MARK(p(true)) -> AP(true)
MARK(p(false)) -> AP(false)

The transformation is resulting in one new DP problem:



   R
DPs
       →DP Problem 1
Nar
           →DP Problem 2
Nar
             ...
               →DP Problem 6
Narrowing Transformation


Dependency Pairs:

AFACT(X) -> MARK(X)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
MARK(p(s(X''))) -> AP(s(mark(X'')))
MARK(p(add(X1', X2'))) -> AP(aadd(mark(X1'), mark(X2')))
MARK(p(p(X''))) -> AP(ap(mark(X'')))
MARK(p(prod(X1', X2'))) -> AP(aprod(mark(X1'), mark(X2')))
MARK(p(zero(X''))) -> AP(azero(mark(X'')))
MARK(p(if(X1', X2', X3'))) -> AP(aif(mark(X1'), X2', X3'))
AP(s(X)) -> MARK(X)
MARK(p(fact(X''))) -> AP(afact(mark(X'')))
MARK(prod(X1, false)) -> APROD(mark(X1), false)
MARK(prod(X1, true)) -> APROD(mark(X1), true)
MARK(prod(X1, 0)) -> APROD(mark(X1), 0)
MARK(prod(X1, s(X'))) -> APROD(mark(X1), s(mark(X')))
MARK(prod(X1, add(X1'', X2''))) -> APROD(mark(X1), aadd(mark(X1''), mark(X2'')))
MARK(prod(X1, p(X'))) -> APROD(mark(X1), ap(mark(X')))
MARK(prod(X1, prod(X1'', X2''))) -> APROD(mark(X1), aprod(mark(X1''), mark(X2'')))
MARK(prod(X1, zero(X'))) -> APROD(mark(X1), azero(mark(X')))
MARK(prod(X1, if(X1'', X2'', X3'))) -> APROD(mark(X1), aif(mark(X1''), X2'', X3'))
MARK(prod(X1, fact(X'))) -> APROD(mark(X1), afact(mark(X')))
MARK(prod(s(X'), X2)) -> APROD(s(mark(X')), mark(X2))
MARK(prod(add(X1'', X2''), X2)) -> APROD(aadd(mark(X1''), mark(X2'')), mark(X2))
MARK(prod(p(X'), X2)) -> APROD(ap(mark(X')), mark(X2))
APROD(s(X), false) -> APROD(mark(X), false)
APROD(s(X), true) -> APROD(mark(X), true)
APROD(s(X), 0) -> APROD(mark(X), 0)
APROD(s(X), s(X'')) -> APROD(mark(X), s(mark(X'')))
APROD(s(X), add(X1', X2')) -> APROD(mark(X), aadd(mark(X1'), mark(X2')))
APROD(s(X), p(X'')) -> APROD(mark(X), ap(mark(X'')))
APROD(s(X), prod(X1', X2')) -> APROD(mark(X), aprod(mark(X1'), mark(X2')))
APROD(s(X), zero(X'')) -> APROD(mark(X), azero(mark(X'')))
APROD(s(X), if(X1', X2', X3')) -> APROD(mark(X), aif(mark(X1'), X2', X3'))
APROD(s(X), fact(X'')) -> APROD(mark(X), afact(mark(X'')))
APROD(s(s(X'')), Y) -> APROD(s(mark(X'')), mark(Y))
APROD(s(add(X1', X2')), Y) -> APROD(aadd(mark(X1'), mark(X2')), mark(Y))
APROD(s(p(X'')), Y) -> APROD(ap(mark(X'')), mark(Y))
APROD(s(prod(X1', X2')), Y) -> APROD(aprod(mark(X1'), mark(X2')), mark(Y))
APROD(s(zero(X'')), Y) -> APROD(azero(mark(X'')), mark(Y))
APROD(s(if(X1', X2', X3')), Y) -> APROD(aif(mark(X1'), X2', X3'), mark(Y))
APROD(s(fact(X'')), Y) -> APROD(afact(mark(X'')), mark(Y))
MARK(prod(prod(X1'', X2''), X2)) -> APROD(aprod(mark(X1''), mark(X2'')), mark(X2))
APROD(s(X), Y) -> MARK(X)
MARK(prod(zero(X'), X2)) -> APROD(azero(mark(X')), mark(X2))
APROD(s(X), Y) -> MARK(Y)
MARK(prod(if(X1'', X2'', X3'), X2)) -> APROD(aif(mark(X1''), X2'', X3'), mark(X2))
AADD(s(X), Y) -> MARK(Y)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
MARK(prod(fact(X'), X2)) -> APROD(afact(mark(X')), mark(X2))
MARK(if(false, X2, X3)) -> AIF(false, X2, X3)
MARK(if(true, X2, X3)) -> AIF(true, X2, X3)
MARK(if(add(X1'', X2''), X2, X3)) -> AIF(aadd(mark(X1''), mark(X2'')), X2, X3)
MARK(if(p(X'), X2, X3)) -> AIF(ap(mark(X')), X2, X3)
MARK(if(prod(X1'', X2''), X2, X3)) -> AIF(aprod(mark(X1''), mark(X2'')), X2, X3)
MARK(if(zero(X'), X2, X3)) -> AIF(azero(mark(X')), X2, X3)
MARK(if(if(X1'', X2'', X3''), X2, X3)) -> AIF(aif(mark(X1''), X2'', X3''), X2, X3)
AIF(false, X, Y) -> MARK(Y)
MARK(if(fact(X'), X2, X3)) -> AIF(afact(mark(X')), X2, X3)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
AADD(s(X), Y) -> MARK(X)
MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
MARK(p(X)) -> MARK(X)
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
MARK(fact(X)) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
MARK(fact(X)) -> AFACT(mark(X))
AADD(0, X) -> MARK(X)
AADD(s(X), false) -> AADD(mark(X), false)


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false





On this DP problem, a Narrowing SCC transformation can be performed.
As a result of transforming the rule

MARK(add(X1, X2)) -> AADD(mark(X1), mark(X2))
20 new Dependency Pairs are created:

MARK(add(fact(X'), X2)) -> AADD(afact(mark(X')), mark(X2))
MARK(add(if(X1'', X2'', X3'), X2)) -> AADD(aif(mark(X1''), X2'', X3'), mark(X2))
MARK(add(zero(X'), X2)) -> AADD(azero(mark(X')), mark(X2))
MARK(add(prod(X1'', X2''), X2)) -> AADD(aprod(mark(X1''), mark(X2'')), mark(X2))
MARK(add(p(X'), X2)) -> AADD(ap(mark(X')), mark(X2))
MARK(add(add(X1'', X2''), X2)) -> AADD(aadd(mark(X1''), mark(X2'')), mark(X2))
MARK(add(s(X'), X2)) -> AADD(s(mark(X')), mark(X2))
MARK(add(0, X2)) -> AADD(0, mark(X2))
MARK(add(true, X2)) -> AADD(true, mark(X2))
MARK(add(false, X2)) -> AADD(false, mark(X2))
MARK(add(X1, fact(X'))) -> AADD(mark(X1), afact(mark(X')))
MARK(add(X1, if(X1'', X2'', X3'))) -> AADD(mark(X1), aif(mark(X1''), X2'', X3'))
MARK(add(X1, zero(X'))) -> AADD(mark(X1), azero(mark(X')))
MARK(add(X1, prod(X1'', X2''))) -> AADD(mark(X1), aprod(mark(X1''), mark(X2'')))
MARK(add(X1, p(X'))) -> AADD(mark(X1), ap(mark(X')))
MARK(add(X1, add(X1'', X2''))) -> AADD(mark(X1), aadd(mark(X1''), mark(X2'')))
MARK(add(X1, s(X'))) -> AADD(mark(X1), s(mark(X')))
MARK(add(X1, 0)) -> AADD(mark(X1), 0)
MARK(add(X1, true)) -> AADD(mark(X1), true)
MARK(add(X1, false)) -> AADD(mark(X1), false)

The transformation is resulting in one new DP problem:



   R
DPs
       →DP Problem 1
Nar
           →DP Problem 2
Nar
             ...
               →DP Problem 7
Remaining Obligation(s)




The following remains to be proven:
Dependency Pairs:

MARK(add(X1, false)) -> AADD(mark(X1), false)
MARK(add(X1, true)) -> AADD(mark(X1), true)
MARK(add(X1, 0)) -> AADD(mark(X1), 0)
MARK(add(X1, s(X'))) -> AADD(mark(X1), s(mark(X')))
MARK(add(X1, add(X1'', X2''))) -> AADD(mark(X1), aadd(mark(X1''), mark(X2'')))
MARK(add(X1, p(X'))) -> AADD(mark(X1), ap(mark(X')))
MARK(add(X1, prod(X1'', X2''))) -> AADD(mark(X1), aprod(mark(X1''), mark(X2'')))
MARK(add(X1, zero(X'))) -> AADD(mark(X1), azero(mark(X')))
MARK(add(X1, if(X1'', X2'', X3'))) -> AADD(mark(X1), aif(mark(X1''), X2'', X3'))
MARK(add(X1, fact(X'))) -> AADD(mark(X1), afact(mark(X')))
MARK(add(0, X2)) -> AADD(0, mark(X2))
MARK(add(s(X'), X2)) -> AADD(s(mark(X')), mark(X2))
MARK(add(add(X1'', X2''), X2)) -> AADD(aadd(mark(X1''), mark(X2'')), mark(X2))
MARK(add(p(X'), X2)) -> AADD(ap(mark(X')), mark(X2))
MARK(add(prod(X1'', X2''), X2)) -> AADD(aprod(mark(X1''), mark(X2'')), mark(X2))
AADD(s(X), false) -> AADD(mark(X), false)
AADD(s(X), true) -> AADD(mark(X), true)
AADD(s(X), 0) -> AADD(mark(X), 0)
AADD(s(X), s(X'')) -> AADD(mark(X), s(mark(X'')))
AADD(s(X), add(X1', X2')) -> AADD(mark(X), aadd(mark(X1'), mark(X2')))
AADD(s(X), p(X'')) -> AADD(mark(X), ap(mark(X'')))
AADD(s(X), prod(X1', X2')) -> AADD(mark(X), aprod(mark(X1'), mark(X2')))
AADD(s(X), zero(X'')) -> AADD(mark(X), azero(mark(X'')))
AADD(s(X), if(X1', X2', X3')) -> AADD(mark(X), aif(mark(X1'), X2', X3'))
AADD(s(X), fact(X'')) -> AADD(mark(X), afact(mark(X'')))
AADD(s(0), Y) -> AADD(0, mark(Y))
AADD(s(s(X'')), Y) -> AADD(s(mark(X'')), mark(Y))
AADD(s(add(X1', X2')), Y) -> AADD(aadd(mark(X1'), mark(X2')), mark(Y))
AADD(s(p(X'')), Y) -> AADD(ap(mark(X'')), mark(Y))
AADD(s(prod(X1', X2')), Y) -> AADD(aprod(mark(X1'), mark(X2')), mark(Y))
AADD(s(zero(X'')), Y) -> AADD(azero(mark(X'')), mark(Y))
AADD(s(if(X1', X2', X3')), Y) -> AADD(aif(mark(X1'), X2', X3'), mark(Y))
AADD(s(fact(X'')), Y) -> AADD(afact(mark(X'')), mark(Y))
MARK(add(zero(X'), X2)) -> AADD(azero(mark(X')), mark(X2))
AADD(s(X), Y) -> MARK(Y)
MARK(add(if(X1'', X2'', X3'), X2)) -> AADD(aif(mark(X1''), X2'', X3'), mark(X2))
AADD(s(X), Y) -> MARK(X)
MARK(add(fact(X'), X2)) -> AADD(afact(mark(X')), mark(X2))
MARK(p(s(X''))) -> AP(s(mark(X'')))
MARK(p(add(X1', X2'))) -> AP(aadd(mark(X1'), mark(X2')))
MARK(p(p(X''))) -> AP(ap(mark(X'')))
MARK(p(prod(X1', X2'))) -> AP(aprod(mark(X1'), mark(X2')))
MARK(p(zero(X''))) -> AP(azero(mark(X'')))
MARK(p(if(X1', X2', X3'))) -> AP(aif(mark(X1'), X2', X3'))
AP(s(X)) -> MARK(X)
MARK(p(fact(X''))) -> AP(afact(mark(X'')))
MARK(prod(X1, false)) -> APROD(mark(X1), false)
MARK(prod(X1, true)) -> APROD(mark(X1), true)
MARK(prod(X1, 0)) -> APROD(mark(X1), 0)
MARK(prod(X1, s(X'))) -> APROD(mark(X1), s(mark(X')))
MARK(prod(X1, add(X1'', X2''))) -> APROD(mark(X1), aadd(mark(X1''), mark(X2'')))
MARK(prod(X1, p(X'))) -> APROD(mark(X1), ap(mark(X')))
MARK(prod(X1, prod(X1'', X2''))) -> APROD(mark(X1), aprod(mark(X1''), mark(X2'')))
MARK(prod(X1, zero(X'))) -> APROD(mark(X1), azero(mark(X')))
MARK(prod(X1, if(X1'', X2'', X3'))) -> APROD(mark(X1), aif(mark(X1''), X2'', X3'))
MARK(prod(X1, fact(X'))) -> APROD(mark(X1), afact(mark(X')))
MARK(prod(s(X'), X2)) -> APROD(s(mark(X')), mark(X2))
MARK(prod(add(X1'', X2''), X2)) -> APROD(aadd(mark(X1''), mark(X2'')), mark(X2))
MARK(prod(p(X'), X2)) -> APROD(ap(mark(X')), mark(X2))
APROD(s(X), false) -> APROD(mark(X), false)
APROD(s(X), true) -> APROD(mark(X), true)
APROD(s(X), 0) -> APROD(mark(X), 0)
APROD(s(X), s(X'')) -> APROD(mark(X), s(mark(X'')))
APROD(s(X), add(X1', X2')) -> APROD(mark(X), aadd(mark(X1'), mark(X2')))
APROD(s(X), p(X'')) -> APROD(mark(X), ap(mark(X'')))
APROD(s(X), prod(X1', X2')) -> APROD(mark(X), aprod(mark(X1'), mark(X2')))
APROD(s(X), zero(X'')) -> APROD(mark(X), azero(mark(X'')))
APROD(s(X), if(X1', X2', X3')) -> APROD(mark(X), aif(mark(X1'), X2', X3'))
APROD(s(X), fact(X'')) -> APROD(mark(X), afact(mark(X'')))
APROD(s(s(X'')), Y) -> APROD(s(mark(X'')), mark(Y))
APROD(s(add(X1', X2')), Y) -> APROD(aadd(mark(X1'), mark(X2')), mark(Y))
APROD(s(p(X'')), Y) -> APROD(ap(mark(X'')), mark(Y))
APROD(s(prod(X1', X2')), Y) -> APROD(aprod(mark(X1'), mark(X2')), mark(Y))
APROD(s(zero(X'')), Y) -> APROD(azero(mark(X'')), mark(Y))
APROD(s(if(X1', X2', X3')), Y) -> APROD(aif(mark(X1'), X2', X3'), mark(Y))
APROD(s(fact(X'')), Y) -> APROD(afact(mark(X'')), mark(Y))
MARK(prod(prod(X1'', X2''), X2)) -> APROD(aprod(mark(X1''), mark(X2'')), mark(X2))
APROD(s(X), Y) -> MARK(X)
MARK(prod(zero(X'), X2)) -> APROD(azero(mark(X')), mark(X2))
APROD(s(X), Y) -> MARK(Y)
MARK(prod(if(X1'', X2'', X3'), X2)) -> APROD(aif(mark(X1''), X2'', X3'), mark(X2))
AADD(0, X) -> MARK(X)
APROD(s(X), Y) -> AADD(mark(Y), aprod(mark(X), mark(Y)))
MARK(prod(fact(X'), X2)) -> APROD(afact(mark(X')), mark(X2))
MARK(if(false, X2, X3)) -> AIF(false, X2, X3)
MARK(if(true, X2, X3)) -> AIF(true, X2, X3)
MARK(if(add(X1'', X2''), X2, X3)) -> AIF(aadd(mark(X1''), mark(X2'')), X2, X3)
MARK(if(p(X'), X2, X3)) -> AIF(ap(mark(X')), X2, X3)
MARK(if(prod(X1'', X2''), X2, X3)) -> AIF(aprod(mark(X1''), mark(X2'')), X2, X3)
MARK(if(zero(X'), X2, X3)) -> AIF(azero(mark(X')), X2, X3)
MARK(if(if(X1'', X2'', X3''), X2, X3)) -> AIF(aif(mark(X1''), X2'', X3''), X2, X3)
AIF(false, X, Y) -> MARK(Y)
MARK(if(fact(X'), X2, X3)) -> AIF(afact(mark(X')), X2, X3)
MARK(s(X)) -> MARK(X)
MARK(add(X1, X2)) -> MARK(X2)
MARK(add(X1, X2)) -> MARK(X1)
MARK(p(X)) -> MARK(X)
MARK(prod(X1, X2)) -> MARK(X2)
MARK(prod(X1, X2)) -> MARK(X1)
MARK(zero(X)) -> MARK(X)
MARK(if(X1, X2, X3)) -> MARK(X1)
MARK(fact(X)) -> MARK(X)
AIF(true, X, Y) -> MARK(X)
AFACT(X) -> AIF(azero(mark(X)), s(0), prod(X, fact(p(X))))
MARK(fact(X)) -> AFACT(mark(X))
AFACT(X) -> MARK(X)


Rules:


afact(X) -> aif(azero(mark(X)), s(0), prod(X, fact(p(X))))
afact(X) -> fact(X)
aadd(0, X) -> mark(X)
aadd(s(X), Y) -> s(aadd(mark(X), mark(Y)))
aadd(X1, X2) -> add(X1, X2)
aprod(0, X) -> 0
aprod(s(X), Y) -> aadd(mark(Y), aprod(mark(X), mark(Y)))
aprod(X1, X2) -> prod(X1, X2)
aif(true, X, Y) -> mark(X)
aif(false, X, Y) -> mark(Y)
aif(X1, X2, X3) -> if(X1, X2, X3)
azero(0) -> true
azero(s(X)) -> false
azero(X) -> zero(X)
ap(s(X)) -> mark(X)
ap(X) -> p(X)
mark(fact(X)) -> afact(mark(X))
mark(if(X1, X2, X3)) -> aif(mark(X1), X2, X3)
mark(zero(X)) -> azero(mark(X))
mark(prod(X1, X2)) -> aprod(mark(X1), mark(X2))
mark(p(X)) -> ap(mark(X))
mark(add(X1, X2)) -> aadd(mark(X1), mark(X2))
mark(s(X)) -> s(mark(X))
mark(0) -> 0
mark(true) -> true
mark(false) -> false




The Proof could not be continued due to a Timeout.
Termination of R could not be shown.
Duration:
1:00 minutes