YES Problem: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Proof: DP Processor: DPs: merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) merge#(.(x,y),.(u,v)) -> if#(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++#(.(x,y),z) -> ++#(y,z) TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Usable Rule Processor: DPs: merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) merge#(.(x,y),.(u,v)) -> if#(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++#(.(x,y),z) -> ++#(y,z) TRS: f11(x,y) -> x f11(x,y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) merge(nil(),y) -> y EDG Processor: DPs: merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) merge#(.(x,y),.(u,v)) -> if#(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++#(.(x,y),z) -> ++#(y,z) TRS: f11(x,y) -> x f11(x,y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) merge(nil(),y) -> y graph: ++#(.(x,y),z) -> ++#(y,z) -> ++#(.(x,y),z) -> ++#(y,z) merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) -> merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) -> merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) -> merge#(.(x,y),.(u,v)) -> if#(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) -> merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) -> merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) -> merge#(.(x,y),.(u,v)) -> if#(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) Restore Modifier: DPs: merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) merge#(.(x,y),.(u,v)) -> if#(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++#(.(x,y),z) -> ++#(y,z) TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x SCC Processor: #sccs: 2 #rules: 3 #arcs: 7/16 DPs: merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) merge#(.(x,y),.(u,v)) -> merge#(y,.(u,v)) TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Matrix Interpretation Processor: dimension: 1 interpretation: [merge#](x0, x1) = x0, [false] = 0, [true] = 0, [++](x0, x1) = x0 + x1 + 1, [if](x0, x1, x2) = x1, [<](x0, x1) = 0, [.](x0, x1) = x1 + 1, [merge](x0, x1) = x0 + x1, [nil] = 0 orientation: merge#(.(x,y),.(u,v)) = y + 1 >= y + 1 = merge#(.(x,y),v) merge#(.(x,y),.(u,v)) = y + 1 >= y = merge#(y,.(u,v)) merge(nil(),y) = y >= y = y merge(x,nil()) = x >= x = x merge(.(x,y),.(u,v)) = v + y + 2 >= v + y + 2 = if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) = y + 1 >= y = y ++(.(x,y),z) = y + z + 2 >= y + z + 2 = .(x,++(y,z)) if(true(),x,y) = x >= x = x if(false(),x,y) = x >= x = x problem: DPs: merge#(.(x,y),.(u,v)) -> merge#(.(x,y),v) TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Matrix Interpretation Processor: dimension: 1 interpretation: [merge#](x0, x1) = x1 + 1, [false] = 0, [true] = 0, [++](x0, x1) = x0 + x1 + 1, [if](x0, x1, x2) = x1, [<](x0, x1) = 0, [.](x0, x1) = x1 + 1, [merge](x0, x1) = x0 + x1 + 1, [nil] = 0 orientation: merge#(.(x,y),.(u,v)) = v + 2 >= v + 1 = merge#(.(x,y),v) merge(nil(),y) = y + 1 >= y = y merge(x,nil()) = x + 1 >= x = x merge(.(x,y),.(u,v)) = v + y + 3 >= v + y + 3 = if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) = y + 1 >= y = y ++(.(x,y),z) = y + z + 2 >= y + z + 2 = .(x,++(y,z)) if(true(),x,y) = x >= x = x if(false(),x,y) = x >= x = x problem: DPs: TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Qed DPs: ++#(.(x,y),z) -> ++#(y,z) TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Matrix Interpretation Processor: dimension: 1 interpretation: [++#](x0, x1) = x0, [false] = 0, [true] = 0, [++](x0, x1) = x0 + x1, [if](x0, x1, x2) = x1, [<](x0, x1) = 0, [.](x0, x1) = x1 + 1, [merge](x0, x1) = x0 + x1 + 1, [nil] = 0 orientation: ++#(.(x,y),z) = y + 1 >= y = ++#(y,z) merge(nil(),y) = y + 1 >= y = y merge(x,nil()) = x + 1 >= x = x merge(.(x,y),.(u,v)) = v + y + 3 >= v + y + 3 = if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) = y >= y = y ++(.(x,y),z) = y + z + 1 >= y + z + 1 = .(x,++(y,z)) if(true(),x,y) = x >= x = x if(false(),x,y) = x >= x = x problem: DPs: TRS: merge(nil(),y) -> y merge(x,nil()) -> x merge(.(x,y),.(u,v)) -> if(<(x,u),.(x,merge(y,.(u,v))),.(u,merge(.(x,y),v))) ++(nil(),y) -> y ++(.(x,y),z) -> .(x,++(y,z)) if(true(),x,y) -> x if(false(),x,y) -> x Qed