SlideShare a Scribd company logo
An Introduction to

並行論理型言語GHCの紹介

小林浩一 (koichik) 【 ます】
あり

【
見覚え】
Agenda




論理型言語Prologの概要
並行論理型言語GHCの概要
GHCによ 並行プロ ミ
る
グラ ング
Prolog概要






1972年頃フラ
ンスで生まれる
一階述語論理のサブセッ (ホーン論理)がベー
ト
ス
1980年代の人工知能ブームで注目
日本ではすっかり
下火


こ 10年和書の新刊無し
こ
?
変数と
定数


変数
英大文字または_で始まる
 _のみだと
無名変数
 ex) A, B, Foo




数値




ex) 1, 2, 3

文字列(シンボル)
英小文字で始まる
またはシングルク
オート
で囲む
 ex) a, bbb, hoge, 'XYZ'

単一化


A=B
変数Aと
変数Bが「 である こ を示す
同じ
」と
 値が未定義の変数は一度だけ具体化でき
る


A = B

AとBは単一 (どちらも未定義)

A = 5

Aと5は単一(Aは5に具体化)
Bも5と単一 (Bも5に具体化)

B = 5

Bは5と単一 (既に具体化済み)
リ の単一化
スト


リ
スト
任意の長さ
を持つデータ
構造
 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]
複合項の単一化


複合項
名前と
数の決まった引数を持つデータ
構造
 ex) point(10, 20)




複合項の単一化
名前と
引数の数が同じ
複合項は単一化でき
る
 同じ
位置の引数同士が単一化さ
れる


model(N, M) = model('EbiYuri', 'CanCam')
Prologプロ ム
グラ



述語の集合
述語




ホーン節の集合

ホーン節
ヘッ と
ド ボディ
を持つ (ボディ
は省略可)
 ボディ
はゴールの集合


H :- B1, B2, ・・・, Bn.
Prologプロ ムの例
グラ
sum(1, 1).
sum(N, S) :N1 is N - 1,
sum(N1, S2),
S is S2 + N.

節1(事実)

述語
節2(規則)
実行イ ージ(1)
メ
処理系に質問する

?- sum(2, S).

1番目の節

単一化できない

sum(1, 1).
実行イ ージ(2)
メ
処理系に質問する

?- sum(2, S).

2番目の節

単一化できる

sum(N, S).

Nは2に単一化
SとSは単一化
実行イ ージ(3)
メ
2番目の節

sum(N, S) :N1 is N - 1,
sum(N1, S2),

1番目の節

単一化できる

sum(1, 1).

N=2
N1は1に単一化
S2は1に単一化
実行イ ージ(4)
メ
2番目の節

sum(N, S) :-

Nは2に単一化

N1 is N - 1,

N1は1に単一化

sum(N1, S2),

S2は1に単一化

S is S2 + N

Sは3に単一化
実行イ ージ(5)
メ
処理系に質問する

?- sum(2, S).

2番目の節

Sは3に単一化

単一化できる

sum(N, S).

N=2,S=3
Prologの逐次性


ボディ
のゴール


記述順に実行する

H :- B1, B2, ・・・, Bn.


述語が複数の節を持つ場合


記述順に試行する

sum(1, 1).
sum(N, S) :-
Prologまと
め


Prologプロ ムは述語の集合
グラ





述語は節の集合
節は一つのヘッ と
ド 任意のボディ
を持つ

単一化


A=B






Aと
Bは「
単一である
」

述語の呼び出し 単一化で決まる
も

逐次性がある



ボディ
のゴールは記述順に実行さ
れる
述語の節は記述順に試行さ
れる
Agenda




論理型言語Prologの概要
並行論理型言語GHCの概要
GHCによ 並行プロ ミ
る
グラ ング
GHC概要




Guarded Horn Clausesの略
上田和紀氏が考案
第五世代プロ
ジェク
ト




並列推論マシンPIMのOS (PIMOS) の
記述言語KL1の土台と
なった

Prologがベース


逐次性を排除
i.e. Prolog - 逐次性
「
Prolog + 並行性」
ではない!

逐次性の排除(1)


ボディ
の複数のゴール
並列に実行さ
れる
 AND並列


H :- B1, B2, ・・・, Bn.
並列に実行
逐次性の排除(2)


述語の複数の節
並列に試行する
 OR並列


sum(1, 1).
並列に試行

sum(N, S) :-
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.

記述順に意味なし
並べ替えても同じ
OR並列
Out = !In

not(0, Out) :Out = 1.
not(1, Out) :Out = 0.

2つの節は並列に
単一化を試みる

not(1, Out) :Out = 0.
not(0, Out) :Out = 1.

記述順に意味なし
並べ替えても同じ
曖昧な節
?- sum(1, S).
sum(1, 1).

? sum(N, S) :どちらの節も
選択可能

N1 is N - 1,
sum(N1, S2),
S is S2 + N.
(これはProlog)
非決定性


選択可能な節が複数ある
場合


どの節が選択さ
れる
かは非決定的
Non-determinism
 Non-deterministic OR-parallel




選択し
た節が失敗(偽)し
た場合


やり ない
直さ
Committed Choice
 Don't care non-determinism

ガード
(1)
H :- G1, G2, …Gm | B1, B2, …Bn.

コミット演算子

ヘッド

ガード

ガード付きホーン節

ボディ
ガード
(2)



ガード
が真と 節のみ選択さ
なる
れる
複数の節のガード
が真と 場合は?
なる


一つの節だけが選択さ
れる




選択は非決定的




ボディ
が実行さ
れる
節は一つだけ
節が排他的になる う
よ ガード
を書く
べき

Falt GHC




ガード
ゴールでは一部の組み込み述語し
か
利用でき
ないGHCのサブセッ
ト
KL1のベース
ガード
(3)
?- sum(1, S).
sum(1, S) :- true |
S = 1.

1番目の節が選択
(記述順に依存しない)

sum(N, S) :- N>1 |
N1 is N - 1,
sum(N1, S2),
S is S2 + N.
AND並列の同期
sum2(N, S) :sum(N, N1),
sum(N1, S).

2つのゴールは並列に
実行していいが…

sum2(N, S)
AND並列

sum(N1, S)

sum(N, N1)
依存関係
OR並列の同期
sum(1, S) :- true |
...
sum(N, S) :- N>1 |
...

2つの節は並列に
試行していいが…

sum(N1, S)
OR並列

sum(N, S)

sum(1, S)
不確定
GHCの同期メ
カニズム


ガード る
によ 同期


ガード
は呼び出し
側の変数を具体化でき
ない
ボディ
では可能
 自分の変数は具体化でき
る




ガード
の実行に必要な変数が具体化さ
れる
まで
待機 (同期化) する
「
単一化でき 」 単一化でき
る or「
ない」
が確定する
まで
待機 (サスペンド する
)
 他の節が選択さ
れる
まで待機 (サスペンド する
)

GHCの同期(1)

N1は具体化
されてない

sum(N1, S)
OR並列

sum(1, S) :- true |
...
呼び出し側の
N1を具体化
できない

sum(N, S) :- N>1 |
...

N1が具体化
されるまで
待機

N(=N1)が具体化
されないと
評価できない
GHCの同期(2)
N1 = 2

sum(N1, S)
OR並列

sum(1, S) :- true |
...
呼び出し側の
N1(=2)と1は
具体化できない

sum(N, S) :- N>1 |
...

右の節が
選択され
ボディ実行

N(=N1=2)は
1より大きい
GHCの出力引数
Prolog

sum(1, 1).

ヘッドで出力
(第2引数)を
単一化する

GHC

sum(1, S) :- true |
S = 1.

ボディで出力
(第2引数)を
単一化する
GHCまと
め


逐次性の排除






ガード る
によ 同期





AND並列:
ボディ
のゴールを並列に実行
OR並列 :
複数の節を並列に試行
細粒度の並行性
ガード
では呼び出し
側の変数を具体化でき
ない
必要なら
具体化さ
れる
まで待機

処理系 (KL1)


KLIC


http://www.klic.org/index.ja.html
Agenda




論理型言語Prologの概要
並行論理型言語GHCの概要
GHCによ 並行プロ ミ
る
グラ ング
ジェネレータ


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 = [].
ジェネレータ
gen(1, 2, X)
gen(2, 2, X)

X = [1 | Xs]

X = [2 | Xs]

gen(3, 2, X)
結果

X = []

X = [1, 2]
フィ
ルタ


入力リ の要素を2倍にし スト
スト
たリ を出力
twice([X|Xs], Y) :- true |
Y1 is X * 2,
Y = [Y1|Ys],
twice(Xs, Ys).
twice([], Y) :- true |
Y = [].
フィ
ルタ
twice([1,2], Y)

Y = [2 | Ys]

twice([2], Y)

Y = [4 | Ys]

twice([], Y)

Y = []

結果

Y = [2, 4]
パイ
プ&フィ
ルタ


ジェネレータ フィ を共有変数で連結
と ルタ


パイ イ
プラ ン並列 or スト ーム並列
リ

pipe(From, To, Y) :- true |
gen(From, To, X),
twice(X, Y).
パイ
プ&フィ
ルタ
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]
動的なプロ
セスネッ ワーク
ト


エラ テネスのふる
スト
いによ 素数の生成
る
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).
素数
J =

primes

gen

sift
素数
J =

sift

primes
2
gen
素数
J =

2

primes

sift

gen

filter
2
3

sift
素数
J =

2

primes

sift

filter
2

gen
4

sift
3
素数
J =

2

3

primes

sift

sift

gen

filter
2

filter
3

5
4

sift
素数
J =

2

3

primes

sift

sift

gen

filter
2

filter
3

6

5

sift
素数
J =

2

3

primes

sift

sift

filter
2

gen
7

6

filter
3

sift
5
素数
J =

2

3

5

primes

sift

sift

sift

gen

filter
2

filter
3

filter
5

8

7
ク ッ ソ
イ ク ート


並列に適し
たアルゴリ
ズム
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).
ク ッ ソ
イ ク ート
quicksort
qsort
qsort

qsort

partition
qsort

partition
高い
独立性

partition

qsort

qsort

qsort
アク ープロ ミ
タ
グラ ング


アク ー?
タ





任意の数のメ セージを受け取る と
ッ
こ ができ
る
任意の数のメ セージを送る と
ッ
こ ができ
る

GHCによ アク ープロ ミ
る タ
グラ ング


アク ー
タ




メ セージの列
ッ




メ セージの列を受け取る
ッ
述語
リ
スト

メ セージ
ッ


リ の要素
スト
アク ープロ ミ
タ
グラ ング


概念

メッセージの列
(リスト)

アクター
アクター

Msg Msg Msg

アクター

(本当はmerger必要)

アクター
アク ープロ ミ
タ
グラ ング


サンプル
pingpong
hello
pong

ping
world
アク ープロ ミ
タ
グラ ング
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([]).
要求駆動


必要と れた時に数列を生成
さ

gen(From, [X|Xs]) :true |
X = From,
Next is From + 1
gen(Next, Xs).
gen(_, []).

gen(1, X),
...
X = [N1|X1],
...
X1 = [N2|X2],
...
X2 = [],
...

初期化
N1 = 1
N2 = 2
終了
GHCによ 並行プロ ミ
る
グラ ングまと
め


プロ
セスネッ ワーク
ト
の構築





パイ
プ&フィ
ルタ
動的な構築が可能

多様なプロ ミ
グラ ングスタ ル
イ


アク ープロ ミ
タ
グラ ングはスタ ルに過ぎない
イ




遅延評価はスタ ルに過ぎない
イ





オブジェク 指向も イ
ト
スタ ルに過ぎない
データ
駆動 (先行評価的)
要求駆動 (遅延評価的)

実は低水準なプロ ミ
グラ ング言語
参考文献


並列論理型言語GHCと
その応用
淵一博監修
 古川康一・
溝口文雄 共編
 ISBN4-320-02266-1




並行論理プロ ミ
グラ ング言語 GHC/KL1
上田和紀
 http://www.ueda.info.waseda.ac.jp/~ueda/readin
gs/GHC-intro.pdf


More Related Content

PDF
2015年度春学期 画像情報処理 第14回 逆投影法による再構成
PDF
吉田プロジェクト2019_人工知能のプロセス
PDF
Rubinの論文(の行間)を読んでみる-傾向スコアの理論-
PPT
言語処理系入門3
PPTX
2SAT(充足可能性問題)の解き方
PPT
言語処理系入門€2
PPTX
GEE(一般化推定方程式)の理論
PDF
Probabilistic Graphical Models 輪読会 §3.3-3.4
2015年度春学期 画像情報処理 第14回 逆投影法による再構成
吉田プロジェクト2019_人工知能のプロセス
Rubinの論文(の行間)を読んでみる-傾向スコアの理論-
言語処理系入門3
2SAT(充足可能性問題)の解き方
言語処理系入門€2
GEE(一般化推定方程式)の理論
Probabilistic Graphical Models 輪読会 §3.3-3.4

What's hot (20)

PDF
Legendre変換の練習問題
PDF
証明論的意味論の具体例
PPTX
人工知能概論 12
PDF
私を SKI に連れてって
PPTX
人工知能概論 5
PDF
スペル修正プログラムの作り方 #pronama
PPT
言語処理系入門1
PDF
Javaプログラミング入門
PDF
機械翻訳の今昔物語
PDF
一階述語論理のメモ
PDF
4thNLPDL
PDF
よくわかるCoqプログラミング
PDF
鬱くしい日本語のための形態素解析入門
PPTX
[NeurIPS2018読み会@PFN] On the Dimensionality of Word Embedding
PDF
代数トポロジー入門
PPTX
All-but-the-Top: Simple and Effective Postprocessing for Word Representations
PDF
Information Retrieval
PDF
topology of musical data
PDF
Introduction of introduction_to_group_theory
PDF
ロマ数16 simizut
Legendre変換の練習問題
証明論的意味論の具体例
人工知能概論 12
私を SKI に連れてって
人工知能概論 5
スペル修正プログラムの作り方 #pronama
言語処理系入門1
Javaプログラミング入門
機械翻訳の今昔物語
一階述語論理のメモ
4thNLPDL
よくわかるCoqプログラミング
鬱くしい日本語のための形態素解析入門
[NeurIPS2018読み会@PFN] On the Dimensionality of Word Embedding
代数トポロジー入門
All-but-the-Top: Simple and Effective Postprocessing for Word Representations
Information Retrieval
topology of musical data
Introduction of introduction_to_group_theory
ロマ数16 simizut
Ad

Viewers also liked (7)

PDF
東京Node学園#6 文字コードと Node
PDF
東京Node学園#3 Domains & Isolates
PDF
Masuidrive Working Style
PDF
東京Node学園#8 Let It Crash!?
PDF
2008/02 STMの紹介
PDF
東京Node学園#1「非同期プログラミングの改善」のエッセンス
PDF
node-handlersocket
東京Node学園#6 文字コードと Node
東京Node学園#3 Domains & Isolates
Masuidrive Working Style
東京Node学園#8 Let It Crash!?
2008/02 STMの紹介
東京Node学園#1「非同期プログラミングの改善」のエッセンス
node-handlersocket
Ad

An Introduction to Guarded Horn Clauses