//[[Documentation]]

*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:
- Slimcode Compile Option: ''--slimcode'' and ''--hl-opt''
- Slim Option: ''--hl''

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
- ''--hl''     : turn on hyperlinks.
- ''--hl-opt'' : turn on hyperlinks and optimize graph matching using hyperlink connection.

**Execution

Specify ''--hl'' when running SLIM, e.g.,
 slim --hl --show-hl hoge.il
- ''--hl''      : turn on 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.

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