• 検索結果がありません。

プログラミング言語論 論理型プログラミング 言語

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング言語論 論理型プログラミング 言語"

Copied!
79
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング言語論 論理型プログラミング

言語

(2)

目次

1.

論理プログラミング

2.

Prolog 入門

3.

Prolog の動作

(3)

.

論理プログラミング

1 . 1 論理型言語

1 . 2 論理プログラミング

1 . 3 述語

(4)

.

1 論理型言語

公理(論理式)の集合を定義し、

推論規則の適用により計算を行う

単一化( unification )が基本 操作

Prolog が代表

1972 カルメラウア、コワルス キー

復習

(5)

.

1 論理型言語

Prolog の応用

自然言語処理

アルゴリズムの記述

データベースの探索

コンパイラの記述

エキスパートシステムの構築

※ パターン照合、後戻り検索、

不完

全な情報を扱う応用に向いて 5

復習

(6)

.

2 論理プログラミング

論理プログラミングとは

(1) 情報の表現のための事実と規 則の使用

(2) 質問の応答への論理推論の使

プログラマが事実と規則を記述

し、質問を与える。処理系が論 6

復習

(7)

?- mortal(Y).

Y=socrates

.

2 論理プログラミング

Prolog の例

human(socrates).

mortal(X) :- human(X).

事実と規則

回答 質問

復習

(8)

.

2 論理プログラミング

論理プログラミングでは、

関数ではなく、関係 (relation) を扱う

引数と結果を同様に扱うので、

関数プログラミングよりも柔軟 である

(9)

.

3 述語

述語 (predicate)

何らかの関係や事実を、述べる

関数のように、引数をとること ができる

真か偽に評価される

(関数のように数値等の値を返

(10)

.

3 述語

新たな述語を論理式で定義する ことによってプログラムを作り 上げていく

基本構造

述語名(項,項,・・・,

項)

(11)

.

3 述語

「 taro は hanako の父親で ある」

システムは、様々な質問に答え

father(taro, hanako).

事実を述べておく

(12)

.

3 述語

質問とその回答 ( 1 )

質問(述語)が、真か偽かを 答える

?- father(taro, hanako).

true.

(13)

.

3 述語

質問とその回答 (2)

?- father(taro, X).

X = hanako .

?- father(Y, hanako).

Y = taro .

X

Y

は変数。 質問を真にするよ うな

(14)

.

3 述語

Prolog の述語について

慣例として、述語名/引数の数

、で Prolog の述語を表現する ( 例 ) atom/1

述語名が同じであっても、引数 の数が異なれば、別の述語とし て扱う

(15)

. Prolog

入門

2 . 1 基本構文

2 . 2 プログラム 2 . 3 質問

2 . 4 否定

2 . 5 演算

(16)

.

Prolog

入門 :基本構

Prolog の基本構文

<fact> ::= <term> .

<rule> ::= <term> :- <terms> .

<query> ::= <terms> .

<term> ::= <number> | <atom> |

<variable> | <atom>(<terms>) 事実

規則

質問

(17)

.

Prolog

入門 :基本構

(term)

事実 (fact) 、規則 (rule) 、質 問 (query) は、項 (term) を用 いて指定される

(18)

.

Prolog

入門 :基本構

単項 (single term) とは

数 (number)

アトム (atom)

小文字で始まる、それ自身を表

変数 (variable)

大文字で始まる

[ 例 ]

(19)

.

Prolog

入門 :基本構

複合項 (compound term) とは

アトムと括弧でくくられた部分 項の並び

述語は複合項により表記される

link(bcpl, c)

(20)

.

Prolog

入門 :基本構

複合項に関する注意

若干の演算子は、前置記法だ けではなく、中置記法で書か れることもある

[ 例 ]

=(X,Y) ⇒ X=Y

(21)

.

Prolog

入門 :プログ ラム

Prolog のプログラム

事実、規則の集まりをファイル にしておく

組込み述語 consult/1 にて読 込む

述語名 引数の数

(22)

.

Prolog

入門 :プログ ラム

規則 (rule) と事実 (fact)

規則の一般形

body1 から bodyN までがすべ て成り立てば head が成立す る、ということを表す

head :- body

1

, body

2

,

・・・

,

body

N

.

(23)

.

Prolog

入門 :プログ ラム

規則は、含意( implication ) を表している

ホーン節で書くと

body

1

・・・ ∧

body

N

→ head

head ∨ body1 ∨ body2 ・・∨ bodyN

(24)

.

Prolog

入門 :プログ ラム

head を頭部(ヘッド部)、残 りの body をまとめて体部(ボ ディ部)と呼ぶ

path(L,M) :- link(L,X), path(X,M).

ヘッド ボディ

(25)

.

Prolog

入門 :プログ ラム

事実 (fact) は、

ヘッド部のみで、ボディ部 のない 特別な規則

とみなす事ができる

link(fortran, algol60).

(26)

.

Prolog

入門 :プログ ラム

プログラム例

% links of programming languages

link(fortran, algol60).

link(algol60, cpl).

link(cpl, bcpl).

(27)

.

Prolog

入門 :プログ ラム

(続き)

link(algol60, simula67).

link(simula67, cplusplus).

link(simula67, smalltalk80).

path(L,L).

path(L,M) :- link(L,X), path(X,M).

(28)

.

Prolog

入門 :プログ ラムこのプログラムは、次のような

プログラミング言語の関係を表 している

(29)

.

Prolog

入門 :プログ ラム

次の事実

path(L,L).

は、

すべての

L

について

path(L,L)

が成り立つ

(30)

.

Prolog

入門 :プログ ラム

次の規則の意味は、

path(L,M) :- link(L,X), path(X,M).

すべての

L, M

について、

もし、ある

X

が存在して

link(L,X)

かつ

path(X,M)

(31)

.

Prolog

入門 :プログ ラム

結局このプログラムは、図の

「矢印」を "link" で表し、

「矢印をたどってたどり着く 道があること」を "path" で 表している

(32)

.

Prolog

入門 :プログ ラム

コンサルト (consult) は、事実 と規則からなるプログラムファイ ルを読込み、その内容を 「規則 データベース」 に追加する

(33)

.

Prolog

入門 :プログ ラム

プログラムの読込み

?- consult( 'links.swi' ).

% links.swi compiled 0.00 sec, 1,652 bytes true.

?-

(34)

.

Prolog

入門 :プログ ラム

演習 8 . 1

次ページの親子関係を、 Prolog プログラムにて記述せよ

次のような述語を作ること

father

mother

parent ( father と mothe

(35)

.

Prolog

入門 :プログ ラム

jiro masae

ichiro reiko

taro keiko

yoshio hanako

(36)

.

Prolog

入門 : 質問

質問 ( query )

Prolog の実行は、 Prolog の処 理系に対し、質問となる述語を 与えることによる

プロンプト「 ?- 」の後に、

質問を入力する

(37)

.

Prolog

入門 : 質問

この実行時に入力する述語列

(質問となる述語列)を、ゴー ル節 と呼ぶ

(処理系は、ゴール到達 目指して推論を進め

(38)

.

Prolog

入門 : 質問

次の質問

の意味は、

<term>

1

, <term>

2

,

・・

,<term>

k

.

<term>

1 かつ

<term>

2 かつ ・・

かつ

<term>

であるか?

(39)

.

Prolog

入門 : 質問

変数のない質問

?- father(taro,hanako),

father(hanako,ichiro).

false.

応答は、単に

true(yes)

(40)

.

Prolog

入門 : 質問

質問文中の変数は、適当な対象 が存在するか否かを問うている

?-

father(jiro,L),father(L,

これは、次のような意味

M).

father(jiro,L)

かつ

father(L,M)

となるような

L,

(41)

.

Prolog

入門 : 質問

(solution)

質問への解とは、

質問文(ゴール節)を真とす るよう

な、変数の値への束縛 である

解を持つ質問文を、

充足可能 (satisfiable) で

ある 41

(42)

.

Prolog

入門 : 質問

充足可能な質問に対するシステ ムの応答

?-

father(jiro,L),father(L, M).

L = yoshio,

(43)

.

Prolog

入門 : 質問

セミコロンを入力 次の解を表示する

改行 (Enter) を入力

解の表示を終了し、次の質問 を受け付けるプロンプトを表 示する

( 注 ) 細かな動作は、システムに 43

(44)

.

Prolog

入門 : 質問

セミコロンを入力した例

?- father(jiro,L),father(L,M ). L = yoshio,

M = ichiro L = yoshio,

;

’ ;’を入力

(45)

. 4 Prolog

入門 : 否定

失敗による否定 (negation as fa ilure)

質問文を充足するのに失敗

⇒ Prolog は false (no) と応 証明することが出来なけれえる ば、

偽に違いない

(46)

. 4 Prolog

入門 : 否定

【例】 前述のプログラムは、 ta ro の親

  については何も言っていな

?-

father(saburo,taro).

false.

(47)

. 4 Prolog

入門 : 否定

否定演算子 not

質問 not(P) は、システムが P を導き出せなければ真として 扱われる

注: not は、複雑な文の場合は使用方法

(48)

?- parent(L,N), parent(M,N), not(L=M).

L = jiro,

N = yoshio, M = masae ; L = taro,

N = hanako,

. 4 Prolog

入門 : 否定

not 演算子の使用例

(49)

. 4 Prolog

入門 : 否定

前ページの例と比較

?- not(L=M), parent(L,N), parent(M,N).

false.

質問が始まった時点で、

L

M

の値は不明である。不明な値は等 しくなりえるので、

not(L=M)

(50)

. 5 Prolog

入門 : 演算

四則演算

+,-,*,/,//, mod   / は実数の除算、 // は整

数の除算、 mod は剰余

比較演算 (数値の比較)

<,>,=<,>=,=:=,

(51)

. 5 Prolog

入門 : 演算

演算結果を変数にセットするには is を使用する

?- X is 1 + 2 + 3.

X = 6.

is

の右辺の式を評価し、左辺

(52)

. 5 Prolog

入門 : 演算

注: is は、通常の代入とは異 なる

?- X is 3, X is 4.

false.

最初の is では、パターンマッチン グ(単一化という=後述)により、

変数 X は3となる。次の is では、

(53)

. 5 Prolog

入門 : 演算

演算の例( 1 )

square(X, Y) :- Y is X * X.

?- square(5, Y).

2

乗を求めるプログ ラム

実行結果

(54)

. 5 Prolog

入門 : 演算

演算の例( 2 )

%

階乗を求める

fact(0, 1).

fact(N, F) :- N > 0, N1 is N - 1,

階乗を求めるプログラム

(55)

. 5 Prolog

入門 : 演算

注:この例は、以下では不可

%

階乗(不可な例)

fact(0, 1).

fact(N, F) :- N > 0,

fact(N - 1, F1),

F is N * F1.

(56)

. 5 Prolog

入門 : 演算

演習8 . 2

フィボナッチ数を求めるプログ ラム fib を、作成せよ

フィボナッチ数の定義

fib(0) = 0, fib(1) = 1 fib(n) = fib(n-1) + fib(n

(57)

. Prolog

の動作

3 . 1 単一化

3 . 2 バックトラック

3 . 3 カット

(58)

.

Prolog

の動作 : 単一

具体化

項の中の変数を、具体的な値に より置換すること

同じ変数は、同じ値で置換しな ければならない

具体値 (instance)

(59)

.

Prolog

の動作 : 単一

例えば

?- f(X,b) = f(a,Y).

X = a, Y = b.

f(a,b)

は、

f(X,b)

および

f(a,Y)

の具体値である

(60)

.

Prolog

の動作 : 単一

単一化 ( unification )

二つの項TとTが同一になる ような変数の具体化を見つけ適 用する(変数が両方の項にあるときは

同じ値で具体化する)

(61)

.

Prolog

の動作 : 単一

関係 identity が、次の事実

により定義されているとする

次の応答を計算するため、単一 化が使用される

identity(Z,Z).

?- identity( f(X,b),

f(a,Y) ).

(62)

.

Prolog

の動作 : 単一

次の二つを単一化

identity(Z,Z)

identity(f(X,b),f(a,Y)) これにより、以下も単一化され

(63)

.

Prolog

の動作:バック トラック

Prolog プログラムの動作の流れ

1.

ゴール節の述語と一致する述

語をヘッド部にもつ節を探す

2.

その節のボディ部の各述語が

真になるかを調べる

3.

ボディ部の述語がすべて真に なれば、 true を返して終了す

(64)

.

Prolog

の動作:バック トラック

4.

別の節のヘッド部で一致する ものを探す

5.

みつかったら、 2. へ。見つか らなかったら false を返して 終了

(65)

.

Prolog

の動作:バック トラック

バックトラックの例

次の質問を考える

?- parent(keiko, hanako).

どのような順序で、

true.

返すのか?

(66)

.

Prolog

の動作:バック トラック

ヘッド部に述語 parent を持 つ節を探す

⇒ parent(X,Y) :- father(X,

Y). を

見つける

{X=keiko, Y=hanako} で単一

⇒ father(keiko, hanako)

(67)

.

Prolog

の動作:バック トラック

ヘッド部に father を持つ節 を探す

⇒ father(jiro, yoshio). が

見つか るが、単一化できず失敗

⇒ バックトラック

別の father をヘッド部とす る述語を探す

⇒ 同様に単一化できず、失敗

(68)

.

Prolog

の動作:バック トラック

バックトラック して、別の節 でヘッド部に述語 parent を 持つものを探す

⇒ parent(X,Y) :- mother (X,Y). を

見つける

{X=keiko, Y=hanako} で単一

⇒ mather(keiko, hanako)

68

(69)

.

Prolog

の動作:バック トラック

ヘッド部に mother を持つ節を 探す

⇒ mother(masae, yoshio). が

見つ かるが、単一化できず失敗

⇒ バックトラック

(70)

.

Prolog

の動作:バック トラック

別の mother をヘッド部とす る述語を探す

⇒ mother(keiko, hanako).

を見つ ける

⇒ mother(keiko, hanako) が

⇒ parent(keiko, hanako) が

70

(71)

.

Prolog

の動作:バック トラック

強制バックトラック

true となった(解が一つ見つ

かった)後も、ユーザが セミコ ロンを入力すると、バックト

ラックを行い次の解を探す

(72)

.

Prolog

の動作:バック トラック

強制バックトラックの例

?- father(jiro,L),father(L,M ). L = yoshio,

M = ichiro

(73)

.

Prolog

の動作 : カッ

バックトラックを続けると、探索 空間全体を調べる

余分な(無駄な)探索を続ける ことがある

カット により、バックトラックを

(74)

.

Prolog

の動作 : カッ

組込み述語 !を評価(実行)す ると、以降の節を探索しない

(そこを後戻りできない)

カットは、最初の実行では無条 件に成功する

それ以前に実行されたゴールの

(75)

.

Prolog

の動作 : カッ

カットの動作 (1)

head :- goalA, ..., goalM, !, goalN, ..., goalZ.

再試行は行われない 再試行する

一方通行

(76)

.

Prolog

の動作 : カッ

カットの動作 (2)

head

1

:- goal

A

, !, goal

B

. head

2

:- goal

C

, goal

D

.

head

13

:- goal

Y

, goal

Z

.

カットは

goal

A の再試 行だけではなく 、次候

(77)

.

Prolog

の動作 : カッ

カット利用の例 = 条件判断

condSubr(X) :- X =:= 1, !, print('One').

condSubr(X) :- print('not One').

カット

(!)

がないと、

1

の時もバッ クトラックにより

'not One'

が表

x

が1でなければ、次の規則を調べ

(78)

【参考】 Prolog 参考U RL

SWI -Prolog's home

http://www.swi-prolog.org/

お気楽 Prolog プログラミング 入門http://www.geocities.jp/m_hi roi /prolog/

Prolog 入門

http://bach.istc.kobe-u.ac.j 78

(79)

お疲れさまでした

参照

関連したドキュメント

2021] .さらに対応するプログラミング言語も作

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

事 業 名 夜間・休日診療情報の多言語化 事業内容 夜間・休日診療の案内リーフレットを多言語化し周知を図る。.

しかし,物質報酬群と言語報酬群に分けてみると,言語報酬群については,言語報酬を与

Tone sandhi rule for pattern substitution in Suzhou Chinese: Verification using words beginning with a Ru syllable Masahiko MASUDA Kyushu University It is well known that in Wu

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge

本部

・条例第 37 条・第 62 条において、軽微なものなど規則で定める変更については、届出が不要とされ、その具 体的な要件が規則に定められている(規則第