%#show violate/3. #show reprowID/1. %#show unreprowID/1. % I and J have a different value on the attribute A of functional dependecy F % For the left and right part diffRight(I,J,F) :- right(F,A), row(I,A,X), row(J,A,Y), X != Y. diffLeft(I,J,F) :- left(F,A), row(I,A,X), row(J,A,Y), X != Y. % I and J conflict on functional dependecy F violate(I,J,F) :- diffRight(I,J,F), not diffLeft(I,J,F). % Simple projection of the row identifers violated violated(I) :- violate(I,G1,G2). % I is in the repair because it conflict with nothing reprowID(I) :- row(I,G1,G2), not violated(I). % I is in the repair because it conflict with J but it is not in it %reprowID(I) :- violated(I), violate(I,J,G), unreprowID(J). % Choose a I that conflict but the other row must not be there reprowID(I) :- violated(I), not unreprowID(I). unreprowID(I) :- violated(I), not reprowID(I). :- violate(I,J,G), reprowID(I), reprowID(J). % There mut be at least one row that remain for a violated functional dependecy F represented(F) :- reprowID(I), violate(I,G,F). :- left(F,G1), violate(G2,G3,F), not represented(F).