DVIOUT-flogic-kb-new

Similar documents
PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

JavaプログラミングⅠ

JavaプログラミングⅠ

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint ppt

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

GEC-Java

基本情報STEP UP演習Java対策

メディプロ1 Javaプログラミング補足資料.ppt

Microsoft PowerPoint - chap10_OOP.ppt

Javaの作成の前に

PowerPoint プレゼンテーション

2

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

プログラミング基礎I(再)

デジタル表現論・第4回

メソッドのまとめ

微分方程式 モデリングとシミュレーション

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

Java言語 第1回

Microsoft PowerPoint - prog04.ppt

Prog2_9th

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Prog1_10th

文字列操作と正規表現

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

ガイダンス

JAVA とテンプレート

1

JavaプログラミングⅠ

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Microsoft PowerPoint - prog08.ppt

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

Prog2_12th

DVIOUT-exer

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Microsoft PowerPoint pptx

JavaプログラミングⅠ

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Sort-of-List-Map(A)

Microsoft PowerPoint - prog08.ppt

JavaプログラミングⅠ

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

JavaプログラミングⅠ

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

JavaプログラミングⅠ

Microsoft PowerPoint - 09.pptx

GEC-Java

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Prog1_6th

4 ソフトウェア工学 Software Engineering 抽象データ型 ABSTRACT DATA TYPE データ抽象 (data abstraction) 目的 : データ構造を ( 実装に依存せずに ) 抽象的に定義 方法 : データにアクセス (read, write) する関数の仕様

PowerPoint Presentation

Java講座

オブジェクト指向プログラミング・同演習 5月21日演習課題

JAVA入門

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

科学的モデリング 2 回 継承 2 無断転載 & 無断配布を禁じます 第 2 回 : 科学的モデリング 継承 2 継承される特性( プロパティ ) 第 2 回の話題 継承は何を継承するのか? 今回のコラムの話題は 継承される特性 ( プロパティ ) についてです そもそもサブクラスはスーパークラスか

デジタル表現論・第6回

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Prog1_3rd

PowerPoint プレゼンテーション

Javaプログラムの実行手順

スライド 1

Prog1_15th

Microsoft PowerPoint - lec06 [互換モード]

構造化プログラミングと データ抽象

PowerPoint プレゼンテーション

Microsoft PowerPoint - Ruby n

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

1

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

Microsoft PowerPoint - Pro110111

プログラミング入門1

JavaプログラミングⅠ

PowerPoint プレゼンテーション

論理と計算(2)

人工知能入門

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Microsoft PowerPoint - HITobject.ppt

F-logic: Introduction to F-logic Elements of F-logic 2.1. Objects and their ID terms 2.2. feature structure (data expression

構造化プログラミングと データ抽象

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

プログラミングA

問題1 以下に示すプログラムは、次の処理をするプログラムである

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

プログラミング入門1

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

V8.1新規機能紹介記事

今回の内容 グラフとオブジェクト指向プログラミング Java を使う理由 Java の基本 Javaのライブラリ 開発 実行 クラスの再利用 クラス継承 抽象クラス 開発の要点

プログラミング入門1

Prog2_10th

Java知識テスト問題

Transcription:

F 論理 -2 1 はじめに 前回 : RDB 主キーと外部キーを区別 OODB OIDのみ F 論理 OIDを1 階の項で表記. OID 間の有向グラフ構造 : F 分子式エッジは ( パラメータ付き ) メソッドでラベリング継承規則などのシステム公理一般のF 論理は, A 1,,A n : B 1,..., B m の形式のルール, OID 間の等号 (mary = mother(tom)), 型推論. 今回は Prolog の拡張として実行できるべく, 制限を加えて話す : DDBの拡張 : A : B 1,..., B m. 等号なし, 型推論なし. F 論理の推論規則 ( の一部 ): DDBの導出法の拡張クラスもメソッドも共にオブジェクト : パラメータ化し, 多態性クラス階層を用いる多態性との比較も 1

Contents 1. はじめに 1.1. Contents 2. F-clause と推論 2.1. F-clause 例 2.2. 分子式の導出 2.3. Inference Rules 2.4. 推論例 ( 述語も含む ) 3. 多態性 1: インタフェースとの比較 3.1. 関数オブジェクト 3.2. Java インタフェース 3.3. メソッドの多態性 3.4. 念のため, 計算過程を例示 3.5. A note on 実装と継承 4. 多態性 2: クラス変数を用いる場合 4.1. parameterized data type 4.2. instanceof 4.3. クラス変数を用いたプログラム 4.4. 参考 : 汎用 qsort の Prolog 版 5. new object 生成 : join で例示 5.1. 参考 : Prolog code for Join in Flogic 6. 演習問題 2

2 F-clause と推論 2.1 F-clause 例 階層 : bob: mnger. bob: facultymember. mnger::employee. EDB:bob [ name Bob ; age 40; worksfor cs [ name CS ; mngr bob; assistants {mary, john ]] IDB: E [ boss M ] :- E:employee, D:dept, M:employee, E [ worksfor D [mnger M ]] システム公理 ISA 継承 : X : Z : X : Y,Y :: Z X :: Z : X :: Y,Y :: Z Ã! k 集合値メソッド : X[M B j ] X[M {B 1,..., B k ] j=1 略記法 (*): X[M1 V] :- X:T, Y:D, Y[M2 V] X[M1 V] :- X:T, Y:D[M2 V] (*) X:c :- Body か,X[M V] :- X:c, Body かを明示的に区別するため, 頭部では略記法を用いないとする 3

2.2 分子式の導出ルールの適用例 : bob[name "Bob";age 40;worksFor cs]. cs:dept[dsname "CS";mngr bob]]. E[boss M] :- E[worksFor D:dept[mnger M]. X:employee :- X[worksFor Z:dept]. mh[worksfor cs] --------------------------------------------------- mh:employee. mh[boss bob]. (mh:employee[boss bob]) 継承の例 : jim:workingst[wageperhour 1000;monthlyWHour 40] workingst::parttime X[income V] :- X:partTime, X[wagePerHour W; monthlywhour H], V is W*H. ------------------------ jim:parttime [income 40000]. 4

2.3 Inference Rules resolution (goal reduction): :- A, As A 0 : Es with Aσ = A 0 σ :- Asσ,Esσ 代入 σ もF 分子式の内部構造に伴い 拡張定義. : 複数の可能性 ISA 階層 X::Z :- X::Y, Y::Z. も右記と同様 :- t1 :c X : Z : X : Y,Y :: Z with (t1 :c)σ =(X : Z)σ :- (X : Y,Y :: Z)σ :- bob : Class bob : fulltime Class = fulltime X::Z :- X::Y, Y::Z. も同様 :- bob : Class X:Z :- X:Y, Y::Z with X=bob, Z=Class :- bob : Y, Y::Class bob:fulltime with Y=fullTime :- fulltime::class fulltime::hasincome with Class = hasincome 5

2.4 推論例 ( 述語も含む ) DDB 同様に, 述語も許す オブジェクト間の関係, オブジェクトの性質 引数はOIDを表す項推論規則もDDBと全く同じ highincome(p) :- P[income V], V > 500000. :- highincome(jim). the above rule with P=jim :- jim[income V], V > 50000. :- jim[income V], V>500000. X[income S] :- X:partTime[ wageperhour W; montlywhour H], S is W*H. V = S, X = jim :- jim:parttime[wageperhour W; monthlywhour H], V is W*H, V>500000 jim:workingst, workingst::parttime :- jim[wageperhour W;monthlyWHour H], V is W*H, V>500000 jim[ wageperhour 1000; monthlywhour 40], W = 1000, H = 40 :- V is 1000*40, V>500000 V = 40000 :- 40000 > 500000 失敗! 6

3 多態性 1: インタフェースとの比較 3.1 関数オブジェクト apply(f,x) = f(x) 関数 f を引数化 ( もの としてみる) apply メソッド 関数 f に x を渡して実行せよ f[apply@x Z] x[f Z]. ( オブジェクトが関数を持つ (*)) func1:myfunc. func1[apply@x V] :-..., V is... func2:myfunc. func2[apply@x V] :-..., V is... process(f,x,y) :- F:myfunc[apply@X V],..., Y is... :- process(func1,10, X) :- func1:myfunc, func1[apply@10 V],...Y is... :- func1[apply@10 V],...,Y is... :-..., V is,...,y is.... 関数オブジェクトと考えると, 関数を変数化し, 様々な関数に対する処理を統一的 抽象的に記述できる (*) オブジェクトがメソッドを持つ : オブジェクト指向の言い方 ( 考え方 ) 実際は, オブジェクトがどのようなメソッドを持つかは, クラスの定義逆に言えば, 所有するメソッドが異なれば, それは別のクラスのオブジェクト 7

3.2 Java インタフェース interface MyFunc { int apply(int x);// メソッド型制約 class Func1 implements MyFunc { public int apply(int x) 関数オブジェクト f ~ 実装クラスオブジェクトそのパラメータ化 F ~ インタフェース参照変数メソッド apply の挙動は {...;...; // メソッド実装 ホストオブジェクトによって変化 多態性 (polymorphism) メソッドの様々な振る舞い... class A { // インタフェース参照変数を用いた応用手続き static int process(myfunc fc, int x) {int v = fc.apply(x);... ; return y; public static void main(string[] args) { Func1 func1 = new Func1();// 実装クラスオブジェクト System.out.println( process(func1, 101) ); 8

3.3 メソッドの多態性 interface HasIncome { // income メソッドを持つもの int income(); class FullTime implements HasIncome{ // フルタイムワーカの場合はこうです private int salary; public int income() {return salary; class PartTime implements HasIncome{ // パートタイムワーカの場合はこうです private int hourpermonth, hourwage; public int income() { return hourpermonth*hourwage; class Company { private hasincome[] employees; // income メソッドを持つもの の配列 int payment() { int payment = 0; for (int i=0;i<employees.length;i++) payment += employees[i].income(); return payment; /* 場合分け ( 実装 ) 下記ではクラス階層なし ~ 陰に : fulltime::any. parttime::any. */ X[income V] :- X:fullTime[salary V]. X[income V] :- X:partTime, X[hourPerMonth H;hourWage W], V is H*W. /* -- データ分子式 ( 事実 )*/ bob:parttime [hourpermonth 30; hourwage 1000]. john:fulltime[salary 20000]. /* -- income 総計算 */ payment([],0). payment([e Es],P) :- /* 陰に E:any */ E[income V], payment(es, EP), P is V + EP. /* full or parttime 以外の要素があれば単に失敗. 動的型検査を行いたい場合は */ fulltime::hasincome. parttime::hasincome. payment([],0). payment([e Es],P) :- E:hasIncome[income V], payment(es, EP), P is V + EP. payment([e _],null) :- \+ E:hasIncome, print( *** type error *** ). */ 9

3.4 念のため, 計算過程を例示 :- payment([tom,jim],p) payment([e Es],P) :- E:hasIncome[income V], payment(es, EP), P is V+EP :- tom:hasincome, tom[income V], payment([jim],p1), P is V+P1. tom:fulltime. fulltime::hasincome. BTP :- tom[income V], payment([jim],p1), P is V+P1. X[income V] :- X:partTime, X[hourPerMonth H;hourWage W], V is H*W. :- tom:parttime,... ( 失敗, バックトラック to BTP) BTP :- tom[income V], payment([jim],p1), P is V+P1. X[income V] :- X:fullTime[salary V] :- tom:fulltime[salary V],payment([jim],P1), P is V+P1. tom:fulltime[salary 300000] :- payment([jim],p1), P is 300000+P1.... :-... 10

3.5 A note on 実装と継承 Jave: クラス階層メソッド定義の継承単一継承 : 定義衝突回避同一パス上でオーバーライドインタフェース : メソッド型制約と定数のみ抽象性 ( インスタンス化不可 ) 実体オブジェクトは実装側で生成実装クラス : 型制約を継承し実装抽象クラス : 抽象性を持つクラスで, インタフェース組込可 F 論理 with 型制約 多重継承はOK( 多重解 ) インタフェースは, メソッド型制約 X:hasIncome[income int] を実装クラス fulltime に継承させる形で, 書式を決めれば OK インタフェースはクラスではない と書いてあるが. 言語仕様上は, 確かにクラスとは異なる. つまり, インタフェースは言語的規制を受けたクラスであり, コンパイル時に規制 ( 抽象性, 実装クラスでの実装義務, などを守っているかをチェックしかし, 実行時は一つのクラス. 何ら区別はない インタフェースは, 多態性の実現のためだけでなく, クラス間の文字通りの インタフェース 11

4 多態性 2: クラス変数を用いる場合 4.1 parameterized data type クラスオブジェクトの変数化 just as 関数オブジェクトの変数化 X:T T はクラスを表す変数とみるその値は クラスオブジェクト []:list(t). [X Y]:list(T) :- X:T, Y:list(T). :- [mh,bob]:list(empl). [mh,bob] = [mh [bob []]] :- mh:empl, [bob]:list(empl). :- [bob]:list(empl). [bob] = [bob []] :- bob:empl, []:list(empl). :- []:list(empl). [a] = [a []] [b,a] = [b [a]] [c,b,a] = [c [b,a]]... [a 1,a 2,,a k ] = [a 1 [a 2,...,a k ]] 演習問題 2.2. 関数オブジェクトのリスト [f1,...,fk]:list(myfunc) と, オブジェクト a を与え,?- rapply(a, [f1,...,fk], X). X = [b1,...,bk] ただし,bj は a に fj を適用して得られる値 となるような rapply を定めよ. 12

4.2 instanceof Flogic []:list(t). [X Y]:list(T) :- X:T, Y:list(T). Prolog instanceof([],list(t)). instanceof([x Xs],list(T)):- instanceof(x,t), instanceof(xs,list(t)). instanceof(tom,st). instanceof(john,st). instanceof(mary,emp). instanceof(kenji,emp). attr(tom,name,"tom"). attr(john,name,"john"). attr(mary,income,100). attr(kenji,income,1000).?- instanceof([tom,john], X). X=list(st). 質問 : [tom,john] の型は何ですか? 答え : それは,st のリスト型です.?- instanceof([tom,mary], X). no tom と mary を統一するクラスは陽には存在しないから no となった st::any. emp::any を追加して,X = list(any) にすべき? 演習問題 2 上記で,tom と mary に対して,no となることを確かめよ. さらに,X=list(any) とするために, どのようなルールを追加すれば良いかを考え, それを与えよ 13

4.3 クラス変数を用いたプログラム qsort(x:list(t), Y:list(T)) 分割 (divide) のとき, クラスに応じた処理を行う多態性 ( クラス変数 T) :- divide(jim,[bob],l1,l2,t). jim:emp, bob:emp, L1 = [bob L11] :- lessthan(bob,jim,emp), divide(jim,[],l11,l2,st). :- jim[income XV], bob[income YV], YV < XV, divide(jim,[],l11,l2,st).... /* クラス変数 T を用いた program */ qsort([],[]). qsort([x Xs],Zs) :- divide(x,xs,ls,gs), qsort(ls,rls), qsort(gs,rgs), append(rls,[x RGs],Zs). divide(x,[],[],[]). divide(x,[y Ys],[Y Ls],Gs) :- X:T, Y:T, lessthan(y,x,t), divide(x,ys,ls,gs). divide(x,[y Ys],Ls,[Y Gs]) :- X:T, Y:T, \+ lessthan(y,x,t), divide(x,ys,ls,gs). /* st での実装 */ lessthan(y,x,st) :- Y[name YN], X[name XN], dicorder(yn, XN). /* emp での実装 */ lessthan(y,x,emp) :- X[income XV], Y[income YV], YV < XV. 給与計算の例と同じスタイルでも書ける st::comparable. emp::comparable. divide(x,[y Ys],[Y Ls],Gs) :- X:comparable, Y:comparable,... 14

4.4 参考 : 汎用 qsort の Prolog 版 qsort([],[]). qsort([x Xs],Zs) :- divide(x,xs,ls,gs), qsort(ls,rls), qsort(gs,rgs), append(rls,[x RGs],Zs). append([],x,x). append([x Xs],Ys,[X Zs]):-append(Xs,Ys,Zs). divide(x,[],[],[]). divide(x,[y Ys],[Y Ls],Gs) :- instanceof(x,t), instanceof(y,t), lessthan(y,x,t), divide(x,ys,ls,gs). divide(x,[y Ys],Ls,[Y Gs]) :- instanceof(x,t), instanceof(y,t), \+ lessthan(y,x,t), divide(x,ys,ls,gs). /* emp での実装 */ lessthan(x,y,emp) :- attr(x,income,xs), attr(y,income,ys), XS < YS. /* st での実装 */ lessthan(x,y,st) :- attr(x,name,xn), attr(y,name,yn), lexicogorder(xn,yn). lexicogorder([],[_ _]). /* 文字列は内部的には character code のリスト */ lexicogorder([x Xs],[Y Ys]):- X < Y. lexicogorder([x Xs],[Y Ys]):- X = Y, lexicogorder(xs,ys). /* st データ */ instanceof(tom,st). attr(tom,name,"tom"). instanceof(john,st). attr(john,name,"john"). instanceof(jim,st). /* emp データ */ instanceof(mary,emp). attr(mary,income,100). instanceof(kenji,emp). attr(kenji,income,1000). /*?- qsort([kenji,mary],x). X=[mary,kenji].?- qsort([john,tom],x). X=[john,tom].?- qsort([mary,tom],x). no これは,mary と tom のクラスが異なるため?- qsort([tom,jim],x). no これは,jim が name attr を持たないため */ 15

5 new object 生成 :join で例示 R at1 a c at2 b d S at1 c b at2 b x R S R.at1 R.at2 S.at1 S.at2 a b c b a b b x c d c b c d b x 等結合 σ R.at2=S.at1 (R S) R.at1 R.at2=S.at1 S.at2 a b x 関係 Rの OID r, そのタプルの OID t t は rのインスタンス ~ t:r. 直積 : 新たな OID 項を導入 new(tr,ts):join(r,s,[]) :- Tr:R, Ts:S. t1:r. s1:s. がEDBに登録 new(t1,s1):joint(r,s,[]) が導出属性の定義 (n: 属性名の衝突を回避 ) new(t,s)[attr Z]:-T[Attr Z]. new(t,s)[n(attr) Z]:-S[Attr Z]. join の第 3 引数 : 結合条件のリスト c(at2,at1) : r の at2 属性値と s の at1 属性値の等価性を要求 new(ptuple,qtuple) が全ての要素条件を満たすことを反復検証 new(ptuple, Qtuple):join(P,Q,[]) :- Ptuple:P, Qtuple:Q. new(ptuple, Qtuple):join(P,Q, [c(pattr,qattr) Cs]) :- Ptuple:P[PAttr V], Qtuple:Q[QAttr V], /* 等価性 */ new(ptuple, Qtuple):join(P,Q, Cs). 16

5.1 参考 : Prolog code for Join in Flogic /* タプルを表す OID としてリスト [tokyo,sapporo] 等を用いる直積のインスタンスは,OID 構成子 new を使わず,2 個のタプルIDからなるリスト [[kagoshima,hukuoka],[hukuoka,tokyo]] 等で表記. query によっては infinite loop なので, 事実を先に書く. ( 停止性の検証は引数条件を設定した上, 帰納的に. この例の場合は,instanceof の第 2 引数に基底項を束縛させたときの停止性を検証できればDBとしては十分 ) */ instanceof([kagoshima,hukuoka],edge). instanceof([hukuoka,tokyo],edge). instanceof([tokyo,sapporo],edge). instanceof([sapporo,kagoshima],edge). /*?- instanceof(x, join(edge,edge,[]) ). 直積 edge edge X = [[kagoshima,hukuoka],[kagoshima,hukuoka]]? ; 別解のプロンプト X = [[kagoshima,hukuoka],[hukuoka,tokyo]]? ; 改行 : 強制終了 yes?- instanceof(x, join(edge,edge,[c(target,source)]) ). X = [[kagoshima,hukuoka],[hukuoka,tokyo]]? ; X = [[hukuoka,tokyo],[tokyo,sapporo]]? ; X = [[tokyo,sapporo],[sapporo,kagoshima]]? ; X = [[sapporo,kagoshima],[kagoshima,hukuoka]]? ; 最後の解 ( 別解を要求し no ) no */ attr(t,source,v) :- instanceof(t,edge), T=[V,_]. /* 関係スキーマに相当 */ attr(t,target,v) :- instanceof(t,edge), T=[_,V]. attr([t,s],attr,v) :- \+ Attr=n(_), attr(t,attr,v). attr([t,s],n(attr),v) :- attr(s,attr,v). instanceof([ptuple,qtuple], join(p,q,[])) :- instanceof(ptuple,p), instanceof(qtuple,q). instanceof([ptuple,qtuple], join(p,q, [c(pattr,qattr) Cs])) :- instanceof(ptuple,p), attr(ptuple,pattr,v), instanceof(qtuple,q), attr(qtuple,qattr,v), instanceof([ptuple,qtuple], join(p,q, Cs)). 17

6 演習問題 2 P 2.1. (sheet 3.1) あなたが普段使っているプログラミング言語を用い, 関数オブジェクト と同様なことができるか否かを論じなさい. ただし,Java については述べたので,Java 以外で解答すること. P 2.2. (sheet 4.1) 関数オブジェクトのリスト [f1,...,fk]:list(myfunc) と, オブジェクト a を与え,?- rapply(a, [f1,...,fk], X). X = [b1,...,bk] ただし,bj は a に fj を適用して得られる値となるような rapply を定めよ. P2.3.(sheet 4.2) []:list(t). [X Xs]:list(T) :- X:T, Xs:list(T). st::any. emp::any. tom:st. mary:emp. に対し, [tom,mary]:list(any) の証明過程を説明しなさい. さらに,Prolog において,instanceof を用い instanceof([tom,mary], list(any)) が成功するために必用なルールを追加しなさい. 18