2009年7月9日木曜日

【LPN】11 Database Manipulation and Collecting Solutions


* 11 Database Manipulation and Collecting Solutions
** 1 Database Manipulation
- assert/1。む、swi-prologはちょっと変なことを言う。

?- listing.
true.

?- assert(happy(mia)).
true.

?- listing.

:- dynamic happy/1.

happy(mia).
true.

?-

- ファイルから読み込んだものはstatic predicates、
REPL?で定義したものはdynamic predicates。
- retract : 撤回する
- swi-prologではretractの対象がDBに複数あるとき、
バックトラック的な操作で全て消せる。

?- retract(happy(vincent)).
true ;
true.

?- listing.

:- dynamic happy/1.

happy(butch).

:- dynamic naive/1.

naive(A) :-
happy(A).
true.

?-

- assertはmemoisaitonに使える。
- database manipulationの迂闊な利用はnightmareだか
ら注意して。

** 2 Collecting Solutions
- findall/3はちょっとmap的。
- bagof/3、便利。
- setof/3、便利。

** 3 Exercise
- Exercise 11.1.
- 第一段階

q(foo,blug).
q(a,b).
q(1,2).

- 第二段階

q(foo,blug).
q(a,b).
p(X) :- h(X).

- 第三段階

p(X) :- h(X).

- Exercise 11.2.
- findall(X,q(blob,X),List).
List = [blug,blag,blig].
- findall(X,q(X,blug),List).
List = [blob,dang].
- findall(X,q(X,Y),List).
List = [blob,blob,blob,,blaf,dang,dang,flab].
- bagof(X,q(X,Y),List).
Y = blug,
List = [blob,dang].
Y = blag,
List = [blob,blaf].
Y = blig,
List = [blob].
Y = dong,
List = [dang].
Y = blob,
List = [flab].
- setof(X,Y^q(X,Y),List).
List = [blaf,blob,dang,flab].

- Exercise 11.3.
- まずこう書いた。
sigma(0,0).
sigma(N,S) :-
M is N - 1, M >= 0,
T is S - N, T >= 0,
sigma(M,T),!,
asserta((:- sigma(N,S))).

- これはpredicateとしては使えるが、構築には使え
ない。

?- sigma(5,15).
true.

?- sigma(10,X).
ERROR: is/2: Arguments are not sufficiently instantiated
^ Exception: (9) _L143 is _G174-10 ?

- traceで調べる。

?- trace.
Unknown message: query(yes)
[trace] ?- sigma(2,X).
Call: (7) sigma(2, _G303) ?
^ Call: (8) _L180 is 2-1 ?
^ Exit: (8) 1 is 2-1 ?
^ Call: (8) 1>=0 ?
^ Exit: (8) 1>=0 ?
^ Call: (8) _L181 is _G303-2 ?
ERROR: is/2: Arguments are not sufficiently instantiated
^ Exception: (8) _L181 is _G303-2 ?
Exception: (7) sigma(2, _G303) ?
?-

- なるほど。Unificationのinstantiationがいまい
ちつかめていないのだな。accumulatorを使おう。

sigma(N,S) :- sigmaAcc(N,0,S),!,asserta((sigma(N,S))).
sigmaAcc(0,A,A) :- !.
sigmaAcc(N,A,S) :-
M is N - 1,
NewA is A + N,
sigmaAcc(M,NewA,S).

assertaが

ERROR: asserta/1: No permission to modify static_procedure `sigma/2'

を吐く。これはまた別の問題なので割愛する。

** 4 Practical Session
- 1.

subset([],_).
subset([H|T],[H|ST]) :-
subset(T,ST).
subset([H|T],[SH|[H|ST]]) :-
subset(T,[SH|ST]).

backtrackで出力する集合に重複があるけどそれは勘
弁。

- 2.

powerset(L,P) :-
findall(X,subset(X,L),P).

先の重複の問題があるので、同じ集合だけど並びが
違うものも含んでしまっている。

?- powerset([a,b,c],P).
P = [[], [a], [a, b], [a, b, c], [a, c], [a, c, b], [b], [b|...], [...|...]|...].

これらの手落ちは後日時間があったらやろう。


よろよろ。

0 件のコメント: