YES Problem: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) Proof: DP Processor: DPs: rev#(cons(x,l)) -> rev2#(x,l) last#(x,l) -> empty#(l) last#(x,l) -> if#(empty(l),x,l) if#(false(),x,l) -> tail#(l) if#(false(),x,l) -> head#(l) if#(false(),x,l) -> last#(head(l),tail(l)) rev2#(x,cons(y,l)) -> rev2#(y,l) rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) TRS: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) TDG Processor: DPs: rev#(cons(x,l)) -> rev2#(x,l) last#(x,l) -> empty#(l) last#(x,l) -> if#(empty(l),x,l) if#(false(),x,l) -> tail#(l) if#(false(),x,l) -> head#(l) if#(false(),x,l) -> last#(head(l),tail(l)) rev2#(x,cons(y,l)) -> rev2#(y,l) rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) TRS: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) graph: if#(false(),x,l) -> last#(head(l),tail(l)) -> last#(x,l) -> if#(empty(l),x,l) if#(false(),x,l) -> last#(head(l),tail(l)) -> last#(x,l) -> empty#(l) last#(x,l) -> if#(empty(l),x,l) -> if#(false(),x,l) -> last#(head(l),tail(l)) last#(x,l) -> if#(empty(l),x,l) -> if#(false(),x,l) -> head#(l) last#(x,l) -> if#(empty(l),x,l) -> if#(false(),x,l) -> tail#(l) rev2#(x,cons(y,l)) -> rev2#(y,l) -> rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) rev2#(x,cons(y,l)) -> rev2#(y,l) -> rev2#(x,cons(y,l)) -> rev2#(y,l) rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) -> rev#(cons(x,l)) -> rev2#(x,l) rev#(cons(x,l)) -> rev2#(x,l) -> rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) rev#(cons(x,l)) -> rev2#(x,l) -> rev2#(x,cons(y,l)) -> rev2#(y,l) SCC Processor: #sccs: 2 #rules: 5 #arcs: 10/64 DPs: rev2#(x,cons(y,l)) -> rev2#(y,l) rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) rev#(cons(x,l)) -> rev2#(x,l) TRS: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) Subterm Criterion Processor: simple projection: pi(cons) = [1,1] pi(rev) = 0 pi(rev2) = 1 pi(rev#) = [0,0] pi(rev2#) = [1,1] problem: DPs: rev2#(x,cons(y,l)) -> rev#(cons(x,rev2(y,l))) TRS: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) SCC Processor: #sccs: 0 #rules: 0 #arcs: 5/1 DPs: if#(false(),x,l) -> last#(head(l),tail(l)) last#(x,l) -> if#(empty(l),x,l) TRS: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) Usable Rule Processor: DPs: if#(false(),x,l) -> last#(head(l),tail(l)) last#(x,l) -> if#(empty(l),x,l) TRS: tail(nil()) -> nil() tail(cons(x,l)) -> l head(cons(x,l)) -> x empty(nil()) -> true() empty(cons(x,l)) -> false() Arctic Interpretation Processor: dimension: 1 usable rules: tail(nil()) -> nil() tail(cons(x,l)) -> l head(cons(x,l)) -> x empty(nil()) -> true() empty(cons(x,l)) -> false() interpretation: [if#](x0, x1, x2) = x0 + 2x2 + -4, [last#](x0, x1) = 1x0 + 3x1 + 0, [tail](x0) = -2x0 + 3, [head](x0) = 1x0, [false] = 6, [cons](x0, x1) = 4x0 + 9x1 + 6, [true] = 0, [empty](x0) = x0 + -8, [nil] = 3 orientation: if#(false(),x,l) = 2l + 6 >= 2l + 6 = last#(head(l),tail(l)) last#(x,l) = 3l + 1x + 0 >= 2l + -4 = if#(empty(l),x,l) tail(nil()) = 3 >= 3 = nil() tail(cons(x,l)) = 7l + 2x + 4 >= l = l head(cons(x,l)) = 10l + 5x + 7 >= x = x empty(nil()) = 3 >= 0 = true() empty(cons(x,l)) = 9l + 4x + 6 >= 6 = false() problem: DPs: if#(false(),x,l) -> last#(head(l),tail(l)) TRS: tail(nil()) -> nil() tail(cons(x,l)) -> l head(cons(x,l)) -> x empty(nil()) -> true() empty(cons(x,l)) -> false() Restore Modifier: DPs: if#(false(),x,l) -> last#(head(l),tail(l)) TRS: empty(nil()) -> true() empty(cons(x,l)) -> false() head(cons(x,l)) -> x tail(nil()) -> nil() tail(cons(x,l)) -> l rev(nil()) -> nil() rev(cons(x,l)) -> cons(rev1(x,l),rev2(x,l)) last(x,l) -> if(empty(l),x,l) if(true(),x,l) -> x if(false(),x,l) -> last(head(l),tail(l)) rev2(x,nil()) -> nil() rev2(x,cons(y,l)) -> rev(cons(x,rev2(y,l))) SCC Processor: #sccs: 0 #rules: 0 #arcs: 2/1