module SortProps where import Sort assert S0 = {sort []} ::: [] assert S1 = All x . {sort [x]} === {[x]} assert S2 = All x1 . All x2 . {sort [x1,x2]} === {[x1,x2]} \/ {sort [x1,x2]} === {[x2,x1]} --assert S = S0 /\ S1 /\ S2 ordered [] = True ordered [x] = True ordered (x1:x2:xs) = x1<=x2 && ordered (x2:xs) lteAll x = all (x<=) orderedInt :: [Int] -> Bool orderedInt = ordered --property IsTrue = {| x | x===True |} --property IsOrdered = {|xs | IsTrue {orderedInt xs} |} property IsOrdered = !ordered assert InsertProp = All x . All xs . IsOrdered xs ==> IsOrdered {insert x xs} assert SortProp1 = All xs . IsOrdered {sort xs} property AllElems P = Gfp X . [] \/ P:X property Minimal x = AllElems (!((x::Int)<=)) property Or1 P Q = {| x | (x:::P) \/ (x:::Q) |} property Or2 P Q = P \/ Q property IsOrdered2 = Lfp X . {| xs | (xs:::[]) \/ (Minimal {head xs} xs /\ ({tail xs}:::X)) |}