I am looking some predicate say generator1_inv which is able to convert invariant generator parameter +Inv (with Inv(a) = a) and some list +ListIn of form [...ai ... Inv(bi)] into some list +ListOut which has distinct members respect to +Inv and if a and Inv(b)=a are members of +ListIn, then Inv(Inv(...(a)) (not a) is a member of +ListOut, where Inv occurs +Order times.
Here some examples what generator1_inv(+ListIn, -ListOut, +Inv, +Order) should do:
Example 1)
?- generator1_inv([k(a), a, k(k(a)), v, b ], ListOut, k, 1)
ListOut = [k(a), v, b]
Example 2)
?- generator1_inv([k(a), r(a), a, k(k(a)), v, b ], ListOut, k, 1)
ListOut = [k(a), r(a), v, b
]
Example 3)
?- generator1_inv([r(a), a, r(abc), d(a), k(k(a)), v, b ], ListOut, k, 1)
ListOut = [r(a), k(a), r(abc), d(a) v, b]
Example 4)
?- generator1_inv([r(a), a, r(abc), d(a), k(k(a)), v, b ], ListOut, k, 0)
ListOut = [r(a), a, r(abc), d(a) v, b]
Found some solution based on this predicate
calc_power: