%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Encoding for semi-stable sets % Input: % arg(x, c) ...x is an argument with claim c % att(x, y) ...argument x attacks argument y % % Output: % in(c) ...claim c is in the extension %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % guess some set of claims in(C) :- arg(_, C), not out(C). out(C) :- arg(_, C), not in(C). % try to satisfy all claims that are in { argIn(X) : arg(X, C) } > 0 :- in(C). % verify that the guess is conflict-free :- argIn(X), argIn(Y), att(X, Y). % verify that the guess is admissible notDefended(X) :- att(Y, X), not argIn(Z) : att(Z, Y). :- argIn(X), notDefended(X). %%% Compute the range, guess some extended range and check, whether there is an admissible set of arguments yielding this extended range % Compute the range of the base guess range(X) :- argIn(X). range(Y) :- argIn(X), att(X, Y). notInRange(X) :- arg(X, _), not range(X). non_trivial :- notInRange(X). % Guess some extended range extendedRange(X) :- range(X), non_trivial. extendedRange(X) : notInRange(X) :- non_trivial. %% Try to find a admissible set yielding the extended range % Each element of the extended range must either be in the set or must be attacked an element of it baseSet(X) | baseSet(Y) : att(Y, X) :- extendedRange(X), non_trivial. % The base set must be conflict-free fail :- baseSet(X), baseSet(Y), att(X, Y), non_trivial. % The base set must be admissible fail | baseSet(Z) : att(Z, Y) :- baseSet(X), att(Y, X), non_trivial. % Saturize failed guesses extendedRange(X) :- fail, arg(X, _), non_trivial. baseSet(X) :- fail, arg(X, _), non_trivial. :- not fail, non_trivial. #show in/1.