We consider the system 05height. Alphabet: cons : [t * f] --> f heightf : [f] --> N heightt : [t] --> N leaf : [] --> t max : [N * N] --> N nil : [] --> f node : [f] --> t s : [N] --> N z : [] --> N Rules: heightf(nil) => z heightf(cons(x, y)) => max(heightt(x), heightf(y)) heightt(leaf) => z heightt(node(x)) => s(heightf(x)) This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). We use the dependency pair framework as described in [Kop12, Ch. 6/7], with static dependency pairs (see [KusIsoSakBla09] and the adaptation for AFSMs and accessible arguments in [Kop13]). We thus obtain the following dependency pair problem (P_0, R_0, static, formative): Dependency Pairs P_0: 0] heightf#(cons(X, Y)) =#> heightt#(X) 1] heightf#(cons(X, Y)) =#> heightf#(Y) 2] heightt#(node(X)) =#> heightf#(X) Rules R_0: heightf(nil) => z heightf(cons(X, Y)) => max(heightt(X), heightf(Y)) heightt(leaf) => z heightt(node(X)) => s(heightf(X)) Thus, the original system is terminating if (P_0, R_0, static, formative) is finite. We consider the dependency pair problem (P_0, R_0, static, formative). We will use the reduction pair processor [Kop12, Thm. 7.16]. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: heightf#(cons(X, Y)) >? heightt#(X) heightf#(cons(X, Y)) >? heightf#(Y) heightt#(node(X)) >? heightf#(X) heightf(nil) >= z heightf(cons(X, Y)) >= max(heightt(X), heightf(Y)) heightt(leaf) >= z heightt(node(X)) >= s(heightf(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: cons = \y0y1.3 + 2y0 + 2y1 heightf = \y0.0 heightf# = \y0.2y0 heightt = \y0.0 heightt# = \y0.2y0 leaf = 3 max = \y0y1.0 nil = 3 node = \y0.3 + 2y0 s = \y0.0 z = 0 Using this interpretation, the requirements translate to: [[heightf#(cons(_x0, _x1))]] = 6 + 4x0 + 4x1 > 2x0 = [[heightt#(_x0)]] [[heightf#(cons(_x0, _x1))]] = 6 + 4x0 + 4x1 > 2x1 = [[heightf#(_x1)]] [[heightt#(node(_x0))]] = 6 + 4x0 > 2x0 = [[heightf#(_x0)]] [[heightf(nil)]] = 0 >= 0 = [[z]] [[heightf(cons(_x0, _x1))]] = 0 >= 0 = [[max(heightt(_x0), heightf(_x1))]] [[heightt(leaf)]] = 0 >= 0 = [[z]] [[heightt(node(_x0))]] = 0 >= 0 = [[s(heightf(_x0))]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace a dependency pair problem (P_0, R_0) by ({}, R_0). By the empty set processor [Kop12, Thm. 7.15] this problem may be immediately removed. As all dependency pair problems were succesfully simplified with sound (and complete) processors until nothing remained, we conclude termination. +++ Citations +++ [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012. [Kop13] C. Kop. Static Dependency Pairs with Accessibility. Unpublished manuscript, http://cl-informatik.uibk.ac.at/users/kop/static.pdf, 2013. [KusIsoSakBla09] K. Kusakari, Y. Isogai, M. Sakai, and F. Blanqui. Static Dependency Pair Method Based On Strong Computability for Higher-Order Rewrite Systems. In volume 92(10) of IEICE Transactions on Information and Systems. 2007--2015, 2009.