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 pi(rev2#) = 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 empty(nil()) -> true() empty(cons(x,l)) -> false() interpretation: [if#](x0, x1, x2) = x0 + x2, [false] = 2, [empty](x0) = 1x0 + -8, [cons](x0, x1) = 6x0 + 10x1 + 3, [last#](x0, x1) = 2x1 + 0, [head](x0) = x0 + -4, [nil] = 0, [tail](x0) = -8x0 + 0, [true] = 1 orientation: if#(false(),x,l) = l + 2 >= -6l + 2 = last#(head(l),tail(l)) last#(x,l) = 2l + 0 >= 1l + -8 = if#(empty(l),x,l) tail(nil()) = 0 >= 0 = nil() tail(cons(x,l)) = 2l + -2x + 0 >= l = l head(cons(x,l)) = 10l + 6x + 3 >= x = x empty(nil()) = 1 >= 1 = true() empty(cons(x,l)) = 11l + 7x + 4 >= 2 = 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