Hyperlinks and hypergraphs

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. A graph structure with hyperlinks forms a (hierarchical) hypergraph.

LMNtal provides syntax and operations for hypergraphs, which will be described below.

Currently, hyperlinks are supported by the SLIM runtime running 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.

The above rule can be written also as

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

Fusing two hyperlinks

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

main.
main :- new($x), new($y) | a($x), b($y).
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.

main.
main :- new($x) | a($x), b($x).
a($h) :- $n = num($h) | number($n).

--> b(!1), number(2). 

Another use:

main.
main :- new($x) | a($x).
a($h) :- $n = num($h), $n < 5 | a($h), a($h).

--> a(!1), a(!1), a(!1), a(!1), a(!1).

Yet another use:

main :- new($x) | flag(!x), a(!x), a(!x), a(!x), a(!x).
a($h) :- hlink($h) | .
flag($h) :- $n = num($h), $n =:= 1 | ok.

--> ok. // ok is created when all a(!1)'s are removed

In this way, using hyperlinks, one can check the absence of a particular hyperlink.

How to use

LaViT

When you execute your program under LaViT (recommended), select the Option tab and turn on the following checkboxes:

Please see below for the details of those options.

Compiling

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

lmntal --slimcode --hl hoge.lmn > hoge.il

Execution

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

slim --hl --show-hl hoge.il

Front page List of pages Search Recent changes Backup   Help   RSS of recent changes