An Introduction to Guarded Horn Clauses5. 単一化
A=B
変数Aと
変数Bが「 である こ を示す
同じ
」と
値が未定義の変数は一度だけ具体化でき
る
A = B
AとBは単一 (どちらも未定義)
A = 5
Aと5は単一(Aは5に具体化)
Bも5と単一 (Bも5に具体化)
B = 5
Bは5と単一 (既に具体化済み)
6. リ の単一化
スト
リ
スト
任意の長さ
を持つデータ
構造
ex) [1, 2, 3] [] [H|T]
リ の単一化
スト
長さ
が同じ スト
リ は単一化でき
る
同じ
位置の要素同士が単一化さ
れる
[1, 2, 3] = [X, Y, Z]
Xは1,Yは2,Zは3
[A, 2, 3] = [1, B|C]
Aは1,Bは2,Cは[3]
21. AND並列
E = A * B + C * D
ex(A,
X
Y
E
B,
is
is
is
C, D, E) :A * B,
C * D,
X + Y.
3つのゴールは
並列実行される
ex(A,
E
X
Y
B,
is
is
is
C, D, E) :X + Y,
A * B,
C * D.
記述順に意味なし
並べ替えても同じ
22. OR並列
Out = !In
not(0, Out) :Out = 1.
not(1, Out) :Out = 0.
2つの節は並列に
単一化を試みる
not(1, Out) :Out = 0.
not(0, Out) :Out = 1.
記述順に意味なし
並べ替えても同じ
29. OR並列の同期
sum(1, S) :- true |
...
sum(N, S) :- N>1 |
...
2つの節は並列に
試行していいが…
sum(N1, S)
OR並列
sum(N, S)
sum(1, S)
不確定
32. GHCの同期(2)
N1 = 2
sum(N1, S)
OR並列
sum(1, S) :- true |
...
呼び出し側の
N1(=2)と1は
具体化できない
sum(N, S) :- N>1 |
...
右の節が
選択され
ボディ実行
N(=N1=2)は
1より大きい
36. ジェネレータ
From~Toまでの数列 (リ ) を生成
スト
gen(From, To, X) :- From =< To |
X = [From|Xs],
Next is From + 1,
gen(Next, To, Xs).
gen(From, To, X) :- From > To |
X = [].
41. パイ
プ&フィ
ルタ
X = [1 | Xs]
gen(1, 2, X)
Y = [2 | Ys]
twice(X, Y)
X = [2 | Xs]
gen(2, 2, X)
Y = [4 | Ys]
twice(X, Y)
X = []
gen(3, 2, X)
Y = []
twice(X, Y)
X = [1, 2]
結果
Y = [2, 4]
42. 動的なプロ
セスネッ ワーク
ト
エラ テネスのふる
スト
いによ 素数の生成
る
primes(N, J) :- true |
gen(2, N, I), sift(I, J).
sift([P|I], J) :- true |
J = [P|L], filter(I, P, K), sift(K, L).
filter([N|I], P, K) :- N mod P =:= 0 |
filter(I, P, K).
filter([N|I], P, K) :- N mod P =¥= 0 |
K =[N|K1], filter(I, P, K1).
51. ク ッ ソ
イ ク ート
並列に適し
たアルゴリ
ズム
quicksort(X, Y) :- true | qsort(X, Y, []).
qsort([X|Xs], Y, Z) :- true |
partition(Xs, X, S, L),
qsort(S, Y, [X|Ys]), qsort(L, Ys, Z).
qsort([], Y, Z) :- true | Y = Z.
partition([H|R], X, S, L) :S = [H|S1], partition(R,
partition([H|R], X, S, L) :L = [H|L1], partition(R,
H =< X |
X, S1, L).
H > X |
X, S, L1).
52. ク ッ ソ
イ ク ート
quicksort
qsort
qsort
qsort
partition
qsort
partition
高い
独立性
partition
qsort
qsort
qsort
53. アク ープロ ミ
タ
グラ ング
アク ー?
タ
任意の数のメ セージを受け取る と
ッ
こ ができ
る
任意の数のメ セージを送る と
ッ
こ ができ
る
GHCによ アク ープロ ミ
る タ
グラ ング
アク ー
タ
メ セージの列
ッ
メ セージの列を受け取る
ッ
述語
リ
スト
メ セージ
ッ
リ の要素
スト
54. アク ープロ ミ
タ
グラ ング
概念
メッセージの列
(リスト)
アクター
アクター
Msg Msg Msg
アクター
(本当はmerger必要)
アクター
56. アク ープロ ミ
タ
グラ ング
pingpong(N) :- true |
ping(N, [hello(X)|_]), pong([X|_]).
ping(N, [hello(Resp)|Msgs]) :- N > 0 |
Resp = [world(Msgs)|_],
N1 is N - 1, ping(N1, Msgs).
ping(0, [hello(Resp)|_]) :- true |
Resp = [].
pong([world(Resp)|Msgs]) :- true |
Resp = [hello(Msgs)|_],
pong(Msgs).
pong([]).
58. GHCによ 並行プロ ミ
る
グラ ングまと
め
プロ
セスネッ ワーク
ト
の構築
パイ
プ&フィ
ルタ
動的な構築が可能
多様なプロ ミ
グラ ングスタ ル
イ
アク ープロ ミ
タ
グラ ングはスタ ルに過ぎない
イ
遅延評価はスタ ルに過ぎない
イ
オブジェク 指向も イ
ト
スタ ルに過ぎない
データ
駆動 (先行評価的)
要求駆動 (遅延評価的)
実は低水準なプロ ミ
グラ ング言語