プログラム中で使える型 |
head_subject_schema 東京大学 'ABC' % ABC という型 'Good morning!' % Good morning! という型 'don''t' % don't という型 |
プログラム中で使える素性 |
F1\ feature\ 素性\ 'Let me see...'\ |
プログラム中で使える変数 |
X $var $1 $変数 |
型 <- [ supertype1 , supertype2,…… ] + [ 素性1\ 型1( 優先度1), 素性2\ 型2( 優先度2),……]. |
素性の定義 | ||||||||
|
素性の制約と対応するAVM | |
employ & EMPLOYER\"John" & EMPLOYEE\"Mary" | |~employ ~| | EMPLOYEE:"Mary" | |_EMPLOYER:"John"_| |
競走馬 & 名前\ ダンスインザダーク & 系統\ 'Hail to Reason' & 父\(種牡馬 & 名前\サンデーサイレンス & 系統\ 'Hail to Reason') | |~競走馬 ~| | 名前:ダンスインザダーク | | 系統:Hail to Reason | | |~種牡馬 ~| | | 父:| 名前:サンデーサイレンス | | | |_系統:Hail to Reason _| | |_母:bot _| |
(型または変数) = (型または変数) |
単一化とその効果 | |
X = man | X に man が代入される。 |
三角形 = 四角形 | 単一化不能。 |
$馬 & 系統\$1 = 父\系統\$1 | $馬 という馬は、父親と同じ系統であることを規定。 |
述語名( 引数1, 引数2…… ) |
(1) | 述語 . |
(2) | 述語 :- 構造1 , 構造2,…… . |
(3) | :- 構造 . |
?- と :- の違い |
> p <- [pred]. q <- [pred]. > a <- [bot]. b <- [bot]. > p(a,b). > p(X,X) :- q(X). > p(b). > ?- p(X,Y), q(Y). X: a Y: b Enter ';' for more choices, otherwise press ENTER --> ; X: [$1] b Y: [$1] ... Enter ';' for more choices, otherwise press ENTER --> ; no (クエリーの場合、変数の値が全て表示され、; を入力するとバックトラックされる) > :- p(X,Y), X=Y, q(Y), print(Y). b (強制実行の場合、何も表示されないが、print 文などにより、 一部の変数の値を表示することができる。なお、バックトラックは行われない。 |
LiLFeSプログラム |
---|
:- module("list:reverse"). :- module_interface. % 必要なモジュールの読み込み :- ensure_loaded("list/append"). % 他のモジュールから見える型の定義 reverse <- [pred]. :- module_implementation. % 他のモジュールから見えない型の定義 reverse_sub <- [pred]. % 述語の定義 reverse_sub([], $X, $X). reverse_sub([$A|$B], $C, $D) :- reverse_sub($B, [$A|$C], $D). reverse($X, $Y) :- reverse($X, [], $Y). |
まずファイルの先頭に,モジュール名を宣言します. モジュール名は何でもかまいませんが,一般的には, ファイルの存在するパスの"/"を":"に変換した文字列を用います. 例えば,LILFES_PATH が ~/lilfes/ のとき,~/lilfes/list/reverse.lil というファイルのモジュール名(=モジュール修飾子)は list:reverse とします.
次に,module_interface の下に,他のモジュールから見える型の定義をします. この例では,reverse 述語を他のモジュールから見えるようにしたいので, その型定義をここに書きます. ここで宣言された型は,他のモジュールからモジュール修飾子(この場合は list:reverse)なしで見えます.
最後に,module_implementation の下に他のモジュールから見えない型の定義と, 述語の定義を記述します. ここで宣言された型はそのままでは他のモジュールから見えませんが, モジュール修飾子をつけると見ることができます. 例えば,reverse_sub という型は他のモジュールからは見ることができませんが, list:reverse:reverse_sub という型は他のモジュールから見ることができます. 述語の定義はここに書くのが一般的ですが, 実際はプログラム中のどこに書いてもかまいません.
他のモジュールで定義されている型や述語を利用したいときは, ensure_loaded ディレクティブを用いてそのモジュールを読み込みます. 上の例では,list/append (モジュール名はおそらく "list:append") というモジュールを読み込んでいるので, そのモジュールで定義されている型や述語をここで使うことができます. ensure_loaded は module_interface 部にも module_implementation 部にも記述することができます (module_interface 部か module_implementation 部に記述するかによって, 他のモジュールから見える型が異なってきます. これは通常の型宣言と同様になります).
二等辺三角形 <- [三角形] ./ extendable. |
[要素1 , 要素2 , ……] |
[先頭の要素 | 後続のリスト] |
条件の構造1 , 条件の構造2 , … -> 成功した場合の述語 ; 失敗した場合の述語 |
if文 |
> p <- [pred]. > check <- [pred]. > a <- [bot]. > b <- [bot]. > p(a). > check(X) :- p(X) -> strprintln("succeed") ; strprintln("failed"). > ?- check(a). succeed ; (Current occupation: 9 heap, 3 stack, 10 trail cell(s), 39 instructions) yes > ?- check(b). failed ; (Current occupation: 9 heap, 3 stack, 8 trail cell(s), 62 instructions) yes |
否定 |
> p <- [pred]. > a <- [bot]. > b <- [bot]. > p(a). > ?- \+ p(a). ; (Current occupation: 15 heap, 23 stack, 16 trail cell(s), 101 instructions) no > ?- \+ p(b). ; (Current occupation: 11 heap, 3 stack, 10 trail cell(s), 122 instructions) yes |
単一化不能 |
> mammal <- bot. > birl <- bot. > cat <- mammal. > ?- mammal \= cat. ; (Current occupation: 10 heap, 20 stack, 16 trail cell(s), 12 instructions) no > ?- mammal \= bird. ; (Current occupation: 10 heap, 3 stack, 12 trail cell(s), 27 instructions) yes |