SlideShare a Scribd company logo
1 of 59
Download to read offline
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

What's hot

スペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方 #pronamaスペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方 #pronama
Hiroyoshi Komatsu
 
鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門
Hiroyoshi Komatsu
 

What's hot (20)

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

Viewers also liked (7)

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

An Introduction to Guarded Horn Clauses