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.

### Creating a hyperlink

• A hyperlink is created by a "new" construct specified in a guard.
```hoge.
hoge :- new(\$h) | a(\$h), b(\$h).
*--> a(!1), b(!1).```
• Each hyperlink is given a fresh private name, which will be printed as a "!" followed by a hexadecimal number.

### Type checking

• The type constraint "hlink(\$x)" checks if \$x represents a hyperlink.
```main.
main :- new(\$x) | a(\$x).
a(\$x) :- hlink(\$x) | b(\$x).
*--> b(!1).```

### Equality checking

• An occurrence of a hyperlink is regarded as a unary atom (with a special, private name). Therefore, the constructs == and \= can be used for comparing two hyperlinks, e.g.,
`a(\$x), b(\$y) :- hlink(\$x), hlink(\$y), \$x == \$y | ok.`

In addition, the above rule can be written as

`a(\$x), b(\$x) :- ok.`

### Fusing two hyperlinks

• Two hyperlinks can be fused 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 (i.e., have different hyperlink names), they will be merged into one; that is, they are made to have the same hyperlink name.

### 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).
a(\$h) :- hlink(\$h) | .
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.

## How to use

### Compiling

Currently, programs with hyperlinks can be executed only under slim. To compile, both --slimcode and --hl (or --hl-opt) options need be specified, e.g.,

`lmntal --slimcode --hl hoge.lmn > hoge.il`
• --hl : uses hyperlinks.
• --hl-opt : uses hyperlinks and optimizes matching

#### Executing

Specify --hl when running slim, e.g.,

`slim --hl --show-hl hoge.il`
• --hl : uses hyperlinks
• currently, this cannot be specified with -nd
• --show-hl : prints the details of hyperlinks
• Without this option, different occurrences of a hyperlink are printed with the same name.
• With this option, each occurrence of a hyperlink is printed with its own ID. In addition, a table of hyperlink occurrences will be printed.