%one level L-stratification
%one stable model
%does not pass finite domain check
%returns stable model only with -nofinitecheck argument

carboxyl(a).
c(a1).
o(a2).
h(a3).
h(a4).
doubleBond(a1,a2).
singleBond(a1,a3).
singleBond(a3,a4).

rc(u(Z1,Z2,Z3,Z4)):- c(Z1), o(Z2), o(Z3), h(Z4), doubleBond(Z1,Z2), singleBond(Z1,Z3), singleBond(Z3,Z4), not gc(Z1), not gc(Z2), not gc(Z3), not gc(Z4).
carboxyl(u(Z1,Z2,Z3,Z4)):- c(Z1), o(Z2), o(Z3), h(Z4), doubleBond(Z1,Z2), singleBond(Z1,Z3), singleBond(Z3,Z4), not gc(Z1), not gc(Z2), not gc(Z3), not gc(Z4).
hasAtom(u(Z1,Z2,Z3,Z4),Z1):- hasAtom(X,Z1), hasAtom(X,Z2), hasAtom(X,Z3), hasAtom(X,Z4), c(Z1), o(Z2), o(Z3), h(Z4), doubleBond(Z1,Z2), singleBond(Z1,Z3), singleBond(Z3,Z4), not gc(Z1), not gc(Z2), not gc(Z3), not gc(Z4).
hasAtom(u(Z1,Z2,Z3,Z4),Z2):- hasAtom(X,Z1), hasAtom(X,Z2), hasAtom(X,Z3), hasAtom(X,Z4), c(Z1), o(Z2), o(Z3), h(Z4), doubleBond(Z1,Z2), singleBond(Z1,Z3), singleBond(Z3,Z4), not gc(Z1), not gc(Z2), not gc(Z3), not gc(Z4).
hasAtom(u(Z1,Z2,Z3,Z4),Z3):- hasAtom(X,Z1), hasAtom(X,Z2), hasAtom(X,Z3), hasAtom(X,Z4), c(Z1), o(Z2), o(Z3), h(Z4), doubleBond(Z1,Z2), singleBond(Z1,Z3), singleBond(Z3,Z4), not gc(Z1), not gc(Z2), not gc(Z3), not gc(Z4).
hasAtom(u(Z1,Z2,Z3,Z4),Z4):- hasAtom(X,Z1), hasAtom(X,Z2), hasAtom(X,Z3), hasAtom(X,Z4), c(Z1), o(Z2), o(Z3), h(Z4), doubleBond(Z1,Z2), singleBond(Z1,Z3), singleBond(Z3,Z4), not gc(Z1), not gc(Z2), not gc(Z3), not gc(Z4).

hasAtom(X,h1(X)):- carboxyl(X), not rc(X).
hasAtom(X,h2(X)):- carboxyl(X), not rc(X).
hasAtom(X,h3(X)):- carboxyl(X), not rc(X).
hasAtom(X,h4(X)):- carboxyl(X), not rc(X).
c(h1(X)):- carboxyl(X), not rc(X).
o(h2(X)):- carboxyl(X), not rc(X).
o(h3(X)):- carboxyl(X), not rc(X).
h(h4(X)):- carboxyl(X), not rc(X).
doubleBond(h1(X),h2(X)):- carboxyl(X), not rc(X).
singleBond(h1(X),h3(X)):- carboxyl(X), not rc(X).
singleBond(h3(X),h4(X)):- carboxyl(X), not rc(X).
gc(h1(X)):- carboxyl(X), not rc(X).
gc(h2(X)):- carboxyl(X), not rc(X).
gc(h3(X)):- carboxyl(X), not rc(X).
gc(h4(X)):- carboxyl(X), not rc(X).


