--- Example to show the non-equivalence of two versions of a
--- non-deterministic insert operation.
import Test.Prop
-- Non-deterministic list insertion defined by overlapping rules:
ndinsert1 :: a -> [a] -> [a]
ndinsert1 x ys = x : ys
ndinsert1 x (y:ys) = y : ndinsert1 x ys
-- Non-deterministic list insertion defined by non-overlapping rules:
ndinsert2 :: a -> [a] -> [a]
ndinsert2 x [] = [x]
ndinsert2 x (y:ys) = x : y : ys ? y : ndinsert2 x ys
-- The equality of both ndinsert operations on ground values always succeeds:
ndinsert_groundequiv x xs = ndinsert1 x xs <~> ndinsert2 x xs
-- Actually, ndinsert1 and ndinsert2 are not equivalent, as can be seen
-- by evaluating `head (ndinsert 1 failed)`.
-- Thus, we check the equivalence with CurryCheck:
-- In PAKCS, the counter example is reported by the 7th test:
ndinsert_equiv = ndinsert1 <=> ndinsert2
-- With termination info, the counter example is reported by the 1st test:
ndinsert_equiv'TERMINATE = ndinsert1 <=> ndinsert2