:- object(concentric, instantiates(constrained_relation)). :- info([ version is 1.0, date is 1998/3/23, author is 'Paulo Moura', comment is 'Concentric polygons as a constrained binary relation.']). :- uses(list). descriptor_([x1, x2]). domain_(x1, polygon). domain_(x2, polygon). key_([x1, x2]). cardinality_(x1, 0, n). cardinality_(x2, 0, n). delete_option_(x1, cascade). delete_option_(x2, cascade). add_tuple([Polygon| Polygons]) :- Polygon::position(X, Y), forall(list::member(Polygon2, Polygons), {Polygon2::move(X, Y)}), ^^add_tuple([Polygon| Polygons]). activ_points_(x1, before, []). activ_points_(x1, after, [move(_, _), transX(_), transY(_)]). activ_points_(x2, before, []). activ_points_(x2, after, [move(_, _), transX(_), transY(_)]). propagate(after, move(X, Y), Polygon, _, Tuple) :- list::select(Polygon, Tuple, Polygons), !, forall( (list::member(Polygon2, Polygons),\+ Polygon2::position(X, Y)), {Polygon2::move(X, Y)}). propagate(after, transX(X), Polygon, _, Tuple) :- list::select(Polygon, Tuple, Polygons), !, forall( (list::member(Polygon2, Polygons), \+ Polygon2::position(X, _)), {Polygon2::transX(X)}). propagate(after, transY(Y), Polygon, _, Tuple) :- list::select(Polygon, Tuple, Polygons), !, forall( (list::member(Polygon2, Polygons), \+ Polygon2::position(_, Y)), {Polygon2::transY(Y)}). :- end_object.