hyperlink仕様まとめ
Last-modified: 2010-10-12 (火) 13:14:16 (4955d)
Top / hyperlink仕様まとめ
随時更新
hyperlinkについて †
概要 †
- hyperlinkアトム(⊂ unaryアトム)によってhyperlinkを表現する
- ファンクタ-ファンクタ間に関係を持たせることで、集合その他もろもろを表現できるようにする
- 略称:hlink, hl
用語など †
- 型
- hyperlinkはhlink型(⊂ unary型)
- hlink型はさらにname型, coname型に分かれる
- name型アトムのファンクタ : !1, !2, ...
- coname型アトムのファンクタ : !-1, !-2, ...
- nameの集合によってハイパーリンクを表現する
- conameはハイパーリンクに名前や属性を持たせるための構造(属性を持たせる機能は実装未定 2010/10/11現在)
- 併合、マージなど
- ハイパーリンク同士を接続する(= hyperlinkの集合を併合する)
インストール †
コンパイラ側 †
- 最新版のJava処理系をCVSからインストール
ランタイム側 †
- subversionからbranches/hyperlink/slimをチェックアウト
- 通常のslimと同じ手順でインストール
実行 †
コンパイラ側 †
ex. lmntal --slimcode --hl hoge.lmn > hoge.il
- 現状、hyperlinkはSLIMでのみ(--slimcodeが必要)使用可能
- --hl : hyperlinkの使用と、同名な型付きプロセス文脈構文を許す
- --hl-opt : 同名の型付きプロセス文脈を利用した最適化モード
- 中間命令findproccxtが挿入される
- ガードに自動的にhlink制約を挿入ことで、ground対groundの構造比較をファンクタ対ファンクタで済ませるようにしている
ランタイム側 †
ex. slim --hl hoge.il
- ハイパーリンクを使うためには--hlオプションが必要
- --hl : ハイパーリンクの使用を許可(コンパイラ側で--hl-optが指定されている場合には最適化モードで実効)
- ndモード未対応
- --showhl : hyperlinkの詳細出力
- --hl : ハイパーリンクの使用を許可(コンパイラ側で--hl-optが指定されている場合には最適化モードで実効)
演算子・制約など †
hyperlink生成 †
- hyperlinkの生成は、new制約によってガードで行なう
hoge. hoge :- new($h) | a($h), b($h). *--> a('!1'), b('!1').
- オプションとして、make制約で任意のidのhyperlinkを生成できる
- ただし、すでにnew制約で生成されたhyperlinkに限る
hoge, fuga(3). hoge :- make(2, $h) | a($h).//makeの第一引数にidを入れる fuga(F):- make(F, $h) | b($h). *--> a('!2'), b('!3').
- まだ生成されていないid、または第一引数がintでない場合はFALSE
型制約 †
- hlink($x), name($x), coname($x)の3種類
a('!1'). a($x) :- hlink($x) b($x). *--> b('!1').
併合 †
- 併合はボディで行なう
- 演算子 "><"
a('!1'), b('!2'). a($x), a($y) :- $x \= $y | a($x), b($y), $x >< $y.
- $xと$yが異なる集合に属しているならば併合する、というルール
- 属性付き変数を実装したならば、and, orの2種類の併合を用意する必要がある
- ">+<", ">*<"とか?"><"はどちらかと同じ意味にするとか?
- $xと$yが異なる集合に属しているならば併合する、というルール
要素数取得 †
- numhyperlinkの接続先の数(=集合内の要素数)を数える
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. // a('!1')が全て無くなった後にokを生成
- つまり膜の否定条件を使わなくても、特定のアトムが無いことを判定できる
- こんな使い方も
応用:変数への値の束縛を表現 †
- ハイパーリンクに値を直接束縛する機能は無いので、例えば以下のようにして表現する
a(!1), b(!1), n(!1,5).
- !1というハイパーリンクに、5という値を持たせたところ
(以下は雑記、仕様が未定、未実装、実装してみたけど動作保証しないものなど)
- 2010-10-21
- findproccxt挿入した場合は、ガードでの等価判定を除きたい
hyperlink専用のプロセス文脈記法みたいなのを入れた場合には、a($x), a($y)
書いたら$xと$yは否定条件をつけるまでもなく別集合であるとするほうがいいかな?- よく考えたら却下。併合されたされてないに関わらず適用させたいルールを書きたい場合がありそう
- 比較(hlink同士)
=:a($x), b($y) :- $x === $y | ... (≠:a($x), b($y) :- $x \== $y | ...)
- 対応関係
name->co-name取得:a($h) :- getconame($x) | a($h). co-name->name取得:a($h) :- getname($x) | a($h).
TODO・MEMO †
- memo
- setconame
derefatom [3, 1, 0] isname [3] setconame [4, 3]
- getconame
derefatom [2, 1, 0] isname [2] getconame [3, 2]
- hasconame
derefatom [2, 1, 0] isname [2] nhasconame [2]
- nhasconame
derefatom [2, 1, 0] isname [2] nhasconame [2]
- setconame
- memo2 : coname管理
- conameを持たないname[h]->parent = h
- conameを持つname[h]->parent = h * -1
- 併合
name-name :a($x), b($y) :- $h = $x >< $y | a($h), b($h). co-name-co-name:未定 name-co-name :未定:">>"とか?
nd対応 †
- ファンクタ管理をndに対応させる方法は置いておく
- ガードでシンボルアトム生成
- そのうちTODO:commitで作業配列をコピーするところが正しく行なわれていない
その他 †
- LMN_FUNCTOR_ATTRを追加、作業配列にファンクタIDを直接埋め込むときに使う
- ガードでアトム用の領域を確保することを避けるため(避けなくても生成することはできるが、気持ち的に)