//[[Documentation]] *Hyperlinks (slim) 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). **Type checking for hyperlinks -hlink($x) a(!1). a($x) :- hlink($x) | b($x). *--> b(!1). **Merging two hyperlinks -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). 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. **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: ''&color(#8B4513){'>'};'', ''&color(#8B4513){'=<'};'', ''&color(#8B4513){'>='};'', ''&color(#8B4513){'=:='};'', ''&color(#8B4513){'=\='};''. :'+'(+$int,+$int,-$int)|integer operation; also: ''&color(#8B4513){'-'};'', ''&color(#8B4513){'*'};'', ''&color(#8B4513){'/'};'', ''&color(#8B4513){mod};''. :'<.'(+$float,+$float)|float comparison; also: ''&color(#8B4513){'>.'};'', ''&color(#8B4513){'=<.'};'', ''&color(#8B4513){'>=.'};'', ''&color(#8B4513){'=:=.'};'', ''&color(#8B4513){'=\=.'};''. :'+.'(+$float,+$float,-$float)|float operation; also: ''&color(#8B4513){'-.'};'', ''&color(#8B4513){'*.'};'', ''&color(#8B4513){'/.'};''. :uniq(+$g1,...,+$gn)|uniqueness constraint; checks if the rule has not been applied to the tuple $g1[X1], ..., $gn[Xn] (n>=0).