| プログラム中で使える型 |
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 |