# %n, where n is an integer = input set
# %e = empty set
# %u = universe
# %m = metamorphic test variable
---
meta_var_type: "isl::set"
meta_check: "%m.is_equal(%m0)"

generators:
    universe:
        - "%1.unite(%1.complement())"
        - "%e.complement()"

    empty:
        - "%1.intersect(%1.complement())"
        - "%1.subtract(%1)"
        - "%1.subtract(%u)"
        - "%1.intersect(%e)"
        - "%u.complement()"

    #invertible_functions:
        #- [ "%1.complement()" , "%1.complement()" ]

relations:
    identity:
        - "%m = %1.unite(%1)"
        - "%m = %1.unite(%e)"
        - "%m = %1.intersect(%1)"
        - "%m = %1.intersect(%u)"
        - "%m = %1.subtract(%e)"
        - "%m = %u.subtract(%1.complement())"
        - "%m = %1.intersect(%1.unite(%2))"
        - "%m = %1.unite(%1.intersect(%2))"
        - "%m = %1.complement().complement()"
        - "%m = %1.coalesce()"
        - "%m = %1.detect_equalities()"

    complement:
        - "%m = %1.complement()"
        - "%m = %u.subtract(%1)"

    subtract:
        - "%m = %1.subtract(%2)"
        - "%m = %1.intersect(%2.complement())"

    union:
        - "%m = %1.unite(%2)"
        - "%m = %1.complement().intersect(%2.complement()).complement()" # DeMorgan

    intersect:
        - "%m = %1.intersect(%2)"
        - "%m = %1.complement().unite(%2.complement()).complement()" # DeMorgan
