トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

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の詳細出力

演算子・制約など

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種類の併合を用意する必要がある
      • ">+<", ">*<"とか?"><"はどちらかと同じ意味にするとか?

要素数取得

  • 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]
  • 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を直接埋め込むときに使う
    • ガードでアトム用の領域を確保することを避けるため(避けなくても生成することはできるが、気持ち的に)