• The added line is THIS COLOR.
• The deleted line is THIS COLOR.
```//[[Documentation]]

LMNtal links represent point-to-point connection between atoms and form an ordinary graph.  In some applications, however, we may want '''hyperlinks''', namely links that interconnect more than two atoms and form a '''hypergraph'''.

LMNtal provides syntax and operations for hypergraphs, which will be described below.  Currently, hyperlinks are supported by the slim runtime
in the ordinary (as opposed to non-deterministic) execution mode.

-A hyperlink is created by a "new" construct specified in a guard.

hoge.
hoge :- new(\$h) | a(\$h), b(\$h).
*--> a(!1), b(!1).

a(!1).
*--> b(!1).

-Two hyperlinks can be merged into one using the "><" operator.

a(!1), b(!2).
a(\$x), a(\$y) :- \$x \= \$y | a(\$x), b(\$y), \$x >< \$y.
--If \$x and \$y represent different hyperlinks, they will be merged into one.

***Number of occurrences
-The "num" construct in a guard will return the number of occurrences of the specified hyperlink.

a(!1), b(!1).
a(\$h) :- \$n = num(\$h) | number(\$n).
*--> b(!1), number(2).
--Another use
a(!1).
a(\$h) :- \$n = num(\$h), \$n < 5 | a(\$h), a(\$h).
*--> a(!1), a(!1), a(!1), a(!1), a(!1).
--Yet another use
flag(!1), a(!1), a(!1), a(!1), a(!1).
flag(\$h) :- \$n = num(\$h), \$n =:= 1 | ok.
*--> ok. // ok is created when all a(!1)'s are removed
---Thus, using hyperlinks, one can check the absence of a particular atom.

**Guard Library

The following type constraints can be used in guards.
The + (input) sign preceding a process context name means that the name should
appear in the head, while the - (output) sign means that the name should not

:'='(+\$u,-\$v)|make sure that \$u[X] and \$v[Y] are unary atoms with the same name.
:'='(-\$u,+\$v)|same as above.
:'=='(+\$u,+\$v)|check if \$u[X] and \$v[Y] are unary atoms with the same name.
:unary(+\$u)|check if \$u[X] is a unary atom.
:ground(+\$g)|check if \$g[X1,...,Xn] (n>0) is a connected graph whose free links are exactly X1,...,Xn.
:int(+\$i)|check if \$i[X] is an integer.
:float(+\$f)|check if \$f[X] is a floating-point number.
:int(+\$float,-\$int)|cast.
:float(+\$int,-\$float)|cast.
:345(-\$int)|defined for every integer (not only with 345).
:'-3.14'(-\$float)|defined for every float.
:'<'(+\$int,+\$int)|integer comparison; also: ''&color(#8B4513){'>'};'', ''&color(#8B4513){'=<'};'', ''&color(#8B4513){'>='};'', ''&color(#8B4513){'=:='};'', ''&color(#8B4513){'=\='};''.
:'+'(+\$int,+\$int,-\$int)|integer operation;  also: ''&color(#8B4513){'-'};'', ''&color(#8B4513){'*'};'', ''&color(#8B4513){'/'};'', ''&color(#8B4513){mod};''.
:'<.'(+\$float,+\$float)|float comparison;   also: ''&color(#8B4513){'>.'};'', ''&color(#8B4513){'=<.'};'', ''&color(#8B4513){'>=.'};'', ''&color(#8B4513){'=:=.'};'', ''&color(#8B4513){'=\=.'};''.
:'+.'(+\$float,+\$float,-\$float)|float operation;    also: ''&color(#8B4513){'-.'};'', ''&color(#8B4513){'*.'};'', ''&color(#8B4513){'/.'};''.
:uniq(+\$g1,...,+\$gn)|uniqueness constraint; checks if the rule has not been applied to the tuple \$g1[X1], ..., \$gn[Xn] (n>=0).

```