  A devil's advocate is one who argues against a claim, not as a committed
opponent but in order to determine the validity of the claim. We are interested
in a devil's advocate that argues against termination of a program. He does so
by producing a maleficent program that can cause the non-termination of the
original program. By inspecting and running the malicious program, one may gain
insight into the potential reasons for non-termination and produce
counterexamples for termination.
  We introduce our method using the concurrent programming language Constraint
Handling Rules (CHR). Like in other declarative languages, non-termination
occurs through unbounded recursion. Given a self-recursive rule, we
automatically generate one or more devil's rules from it. The construction of
the devil's rules is straightforward and involves no guessing. The devil's
rules can be simple. For example, they are non-recursive for rules with single
recursion.
  We show that the devil's rules are maximally vicious in the following sense:
For any program that contains the self-recursive rule and for any infinite
computation through that rule in that program, there is a corresponding
infinite computation with the recursive rule and the devil's rules alone. In
that case, the malicious rules serve as a finite witness for non-termination.
On the other hand, if the devil's rules do not exhibit an infinite computation,
the recursive rule is unconditionally terminating. We also identify cases where
the static analysis of the devil's rule decides termination or non-termination
of the recursive rule.
