diff --git a/examples/equivalent_operations/NDInsert.curry b/examples/equivalent_operations/NDInsert.curry new file mode 100644 index 0000000000000000000000000000000000000000..55adb61da6f6856f388a4bee10304967b7e3c419 --- /dev/null +++ b/examples/equivalent_operations/NDInsert.curry @@ -0,0 +1,25 @@ +--- Example to show the non-equivalence of two versions of a +--- non-deterministic insert operation. + +import Test.Prop + +-- Non-deterministic defined by overlapping rules: +ndinsert1 :: a -> [a] -> [a] +ndinsert1 x ys = x : ys +ndinsert1 x (y:ys) = y : ndinsert1 x ys + +-- Non-deterministic 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 +