Skip to content

TagExtension

Uses comments to add tags to rules and atoms in the reified program.

Tagging Rules

All tag comments before a rule are added as tags to that rule. Tag comments appear in a comment line starting with @ followed by the tag. The tag is a clingo symbol which can use variables that appear (safe) in the rule.

Example

The following program adds the tags mytag and mytag(1) to the rule a:-b.

% @mytag
% @mytag(1)
a:-b.
b.

Reification is extended with the following tag atoms:

tag(rule(disjunction(1),normal(1)),mytag(1)).
tag(rule(disjunction(1),normal(1)),mytag).

Example

The following program adds the tags mytag and mytag(1) to the rule a:-b.

% @label("If {} is parent of {}, then {} is person.",(X,Y,X))
person(X):-parent(X,Y).
parent(anna,maria).

Reification is extended with the following tag atom:

tag(rule(disjunction(1),normal(1)),label("If {} is parent of {}, then {} is person.",(anna,maria,anna))).

Warning

Notice that the variables X and Y are replaced by their ground terms. But only if they are variables in the tag atom, not if they appear in a string like "X is parent of Y".

Tagging Atoms

Tag comments can also be used to tag atoms in the reified program. This is specially helpful; to avoid the need of tagging rules coming form the input.

The atoms for tags are also symbols starting with @ followed by the tag. But atom tags have the symbol :: after the tag, followed by the atom to be tagged.

Example

The following program adds the tags domain and label("{} is a person", (P)) to the atoms person(P).

% @label("{} is a person", (P)) :: person(P)
% @domain :: person(P)

person(anna;maria;juan).

Reification is extended with the following tag atoms:

tag(atom(2),domain).
tag(atom(3),domain).
tag(atom(4),domain).
tag(atom(2),label("{} is a person",juan)).
tag(atom(3),label("{} is a person",maria)).
tag(atom(4),label("{} is a person",anna)).

Note

The atoms added to the reification use the internal atom ids assigned during grounding.

Atom Tags with Conditions

Atom tags can also contain conditions. These are specified after symbol :

Example

% @label("{} is an adult", (P)) :: person(P) : age(P,A), A > 10
% @label("{} is a child", (P)) :: person(P) : age(P,A), A <= 10
% @domain :: person(P)

person(anna;maria;juan).
age(anna,20).
age(maria,7).
age(juan,25).

Reification is extended with the following tag atoms:

tag(atom(8),domain).
tag(atom(9),domain).
tag(atom(10),domain).
tag(atom(9),label("{} is a child",maria)).
tag(atom(8),label("{} is an adult",juan)).
tag(atom(10),label("{} is an adult",anna)).

Notice how the tag label("{} is a child", (P)) is only added to person(maria) since only for this atom the condition age(P,A), A <= 10 holds.

Default Tags

By default, the TagExtension adds tags to all rules with a string using the with the first order representation of the rule.

a(X):-b(X).

is tagged as

% @rule_fo("a(X):-b(X).")
a(X):-b(X).

Tip

You can customize the tagging behavior using the include_fo and include_loc parameters when initializing the TagExtension.

Note

Including these default tags will prevent grounding simplification so that multiple rules remain distinct. Otherwise, in a program like person(anna). person(maria)., both facts would be simplified the same literal number since they are true.