Hyperlinks
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).
a(!1).
a($h) :- $n = num($h), $n < 5 | a($h), a($h).
*--> a(!1), a(!1), a(!1), a(!1), a(!1).
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.