YES

We show the termination of the TRS R:

  flatten(nil()) -> nil()
  flatten(unit(x)) -> flatten(x)
  flatten(++(x,y)) -> ++(flatten(x),flatten(y))
  flatten(++(unit(x),y)) -> ++(flatten(x),flatten(y))
  flatten(flatten(x)) -> flatten(x)
  rev(nil()) -> nil()
  rev(unit(x)) -> unit(x)
  rev(++(x,y)) -> ++(rev(y),rev(x))
  rev(rev(x)) -> x
  ++(x,nil()) -> x
  ++(nil(),y) -> y
  ++(++(x,y),z) -> ++(x,++(y,z))

-- SCC decomposition.

Consider the dependency pair problem (P, R), where P consists of

p1: flatten#(unit(x)) -> flatten#(x)
p2: flatten#(++(x,y)) -> ++#(flatten(x),flatten(y))
p3: flatten#(++(x,y)) -> flatten#(x)
p4: flatten#(++(x,y)) -> flatten#(y)
p5: flatten#(++(unit(x),y)) -> ++#(flatten(x),flatten(y))
p6: flatten#(++(unit(x),y)) -> flatten#(x)
p7: flatten#(++(unit(x),y)) -> flatten#(y)
p8: rev#(++(x,y)) -> ++#(rev(y),rev(x))
p9: rev#(++(x,y)) -> rev#(y)
p10: rev#(++(x,y)) -> rev#(x)
p11: ++#(++(x,y),z) -> ++#(x,++(y,z))
p12: ++#(++(x,y),z) -> ++#(y,z)

and R consists of:

r1: flatten(nil()) -> nil()
r2: flatten(unit(x)) -> flatten(x)
r3: flatten(++(x,y)) -> ++(flatten(x),flatten(y))
r4: flatten(++(unit(x),y)) -> ++(flatten(x),flatten(y))
r5: flatten(flatten(x)) -> flatten(x)
r6: rev(nil()) -> nil()
r7: rev(unit(x)) -> unit(x)
r8: rev(++(x,y)) -> ++(rev(y),rev(x))
r9: rev(rev(x)) -> x
r10: ++(x,nil()) -> x
r11: ++(nil(),y) -> y
r12: ++(++(x,y),z) -> ++(x,++(y,z))

The estimated dependency graph contains the following SCCs:

  {p1, p3, p4, p6, p7}
  {p9, p10}
  {p11, p12}


-- Reduction pair.

Consider the dependency pair problem (P, R), where P consists of

p1: flatten#(unit(x)) -> flatten#(x)
p2: flatten#(++(unit(x),y)) -> flatten#(y)
p3: flatten#(++(unit(x),y)) -> flatten#(x)
p4: flatten#(++(x,y)) -> flatten#(y)
p5: flatten#(++(x,y)) -> flatten#(x)

and R consists of:

r1: flatten(nil()) -> nil()
r2: flatten(unit(x)) -> flatten(x)
r3: flatten(++(x,y)) -> ++(flatten(x),flatten(y))
r4: flatten(++(unit(x),y)) -> ++(flatten(x),flatten(y))
r5: flatten(flatten(x)) -> flatten(x)
r6: rev(nil()) -> nil()
r7: rev(unit(x)) -> unit(x)
r8: rev(++(x,y)) -> ++(rev(y),rev(x))
r9: rev(rev(x)) -> x
r10: ++(x,nil()) -> x
r11: ++(nil(),y) -> y
r12: ++(++(x,y),z) -> ++(x,++(y,z))

The set of usable rules consists of

  (no rules)

Take the reduction pair:

  lexicographic combination of reduction pairs:
  
    1. lexicographic path order with precedence:
    
      precedence:
      
        flatten# > ++ > unit
      
      argument filter:
    
        pi(flatten#) = 1
        pi(unit) = [1]
        pi(++) = [1, 2]
    
    2. lexicographic path order with precedence:
    
      precedence:
      
        flatten# > ++ > unit
      
      argument filter:
    
        pi(flatten#) = 1
        pi(unit) = 1
        pi(++) = 1
    
    3. lexicographic path order with precedence:
    
      precedence:
      
        flatten# > ++ > unit
      
      argument filter:
    
        pi(flatten#) = []
        pi(unit) = [1]
        pi(++) = [1]
    

The next rules are strictly ordered:

  p1, p2, p3, p4, p5

We remove them from the problem.  Then no dependency pair remains.

-- Reduction pair.

Consider the dependency pair problem (P, R), where P consists of

p1: rev#(++(x,y)) -> rev#(x)
p2: rev#(++(x,y)) -> rev#(y)

and R consists of:

r1: flatten(nil()) -> nil()
r2: flatten(unit(x)) -> flatten(x)
r3: flatten(++(x,y)) -> ++(flatten(x),flatten(y))
r4: flatten(++(unit(x),y)) -> ++(flatten(x),flatten(y))
r5: flatten(flatten(x)) -> flatten(x)
r6: rev(nil()) -> nil()
r7: rev(unit(x)) -> unit(x)
r8: rev(++(x,y)) -> ++(rev(y),rev(x))
r9: rev(rev(x)) -> x
r10: ++(x,nil()) -> x
r11: ++(nil(),y) -> y
r12: ++(++(x,y),z) -> ++(x,++(y,z))

The set of usable rules consists of

  (no rules)

Take the reduction pair:

  lexicographic combination of reduction pairs:
  
    1. lexicographic path order with precedence:
    
      precedence:
      
        ++ > rev#
      
      argument filter:
    
        pi(rev#) = 1
        pi(++) = [1, 2]
    
    2. lexicographic path order with precedence:
    
      precedence:
      
        ++ > rev#
      
      argument filter:
    
        pi(rev#) = 1
        pi(++) = [2]
    
    3. lexicographic path order with precedence:
    
      precedence:
      
        ++ > rev#
      
      argument filter:
    
        pi(rev#) = 1
        pi(++) = [2]
    

The next rules are strictly ordered:

  p1, p2

We remove them from the problem.  Then no dependency pair remains.

-- Reduction pair.

Consider the dependency pair problem (P, R), where P consists of

p1: ++#(++(x,y),z) -> ++#(x,++(y,z))
p2: ++#(++(x,y),z) -> ++#(y,z)

and R consists of:

r1: flatten(nil()) -> nil()
r2: flatten(unit(x)) -> flatten(x)
r3: flatten(++(x,y)) -> ++(flatten(x),flatten(y))
r4: flatten(++(unit(x),y)) -> ++(flatten(x),flatten(y))
r5: flatten(flatten(x)) -> flatten(x)
r6: rev(nil()) -> nil()
r7: rev(unit(x)) -> unit(x)
r8: rev(++(x,y)) -> ++(rev(y),rev(x))
r9: rev(rev(x)) -> x
r10: ++(x,nil()) -> x
r11: ++(nil(),y) -> y
r12: ++(++(x,y),z) -> ++(x,++(y,z))

The set of usable rules consists of

  r10, r11, r12

Take the reduction pair:

  lexicographic combination of reduction pairs:
  
    1. lexicographic path order with precedence:
    
      precedence:
      
        nil > ++ > ++#
      
      argument filter:
    
        pi(++#) = [1]
        pi(++) = [1, 2]
        pi(nil) = []
    
    2. lexicographic path order with precedence:
    
      precedence:
      
        nil > ++ > ++#
      
      argument filter:
    
        pi(++#) = 1
        pi(++) = 1
        pi(nil) = []
    
    3. lexicographic path order with precedence:
    
      precedence:
      
        nil > ++ > ++#
      
      argument filter:
    
        pi(++#) = 1
        pi(++) = 1
        pi(nil) = []
    

The next rules are strictly ordered:

  p1, p2

We remove them from the problem.  Then no dependency pair remains.