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 appear in the head.

'='(+\$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: '>', '=<', '>=', '=:=', '=\='.
'+'(+\$int,+\$int,-\$int)
integer operation; also: '-', '*', '/', mod.
'<.'(+\$float,+\$float)
float comparison; also: '>.', '=<.', '>=.', '=:=.', '=\=.'.
'+.'(+\$float,+\$float,-\$float)
float operation; also: '-.', '*.', '/.'.
uniq(+\$g1,...,+\$gn)
uniqueness constraint; checks if the rule has not been applied to the tuple \$g1[X1], ..., \$gn[Xn] (n>=0).