ϓϩάϥϜཧͱ ޠݴPart2-1-6
2
2.1
1
ཧޠݴܕ
σʔλߏͱ୯ҰԽ
Ϧετ
Ϧετͷఆٛ
લճʹ͓͍ͯɺσʔλϕʔεͷ͔؍ΒཧΛಋೖͨ͠ɻ
ݻମΛද͢ఆͱมʹݶఆͨͩͬͨ͠
ࠓճɺҰൠͷϓϩάϥϜͯ͠ͱޠݴɺσʔλߏΛѻ͏ඞ
ཁੑ͔Βɺʮؔ߸هʯΛͨ͠ڐ߹ʹ͍ͭͯड़Δ
t = [X1 , ..., Xn ] = [X1 |[X2 |....[Xn |[ ]]...]]
ͳΔ୯ҰԽ͕ޭ͢Δ͜ͱɻ
[ ] ۭϦετͰɼ̌͞ͷϦετΛ͢͞
ؔ߸هɿ σʔλߏߏࢠ
ಛʹɺؔ͋ͰޠݴܕΔ LISP ಉ༷ʹɺσʔλશͯࣜͱ͠
ͯѻΘΕɺ·ͨɺಛʹɺϦετ͕ओཁͳߏදͳͱݱΔ
جຊ࠶ؼతखଓ͖ʢ܁Γฦ͠࠶ؼతʹॻ͘ʣ
ઢܗϦετ [a,b,c]
[a|[b|[c|[]]]] ͷུه
ߏߏࢠ [_|_]
ෳ߹Ϧετ [a,[1,2,3],c]
[a|[[1|[2|[3|[]]]]|[c|[]]]]
ͷུ
Ϧετͷఆٛ
1
2
2.2
2.3
ࣜͱͯ͠ͷσʔλɺೖ
߲ (term): มɺఆɺ͘͠ f (t1 , ..., tn )ɺwhere f : ߲
Lisp ʹ͓͚Δ̨ࣜͷΑ͏ʹɺཧ͕ޠݴܕѻ͏σʔλશ
ͯɺ߲ (term) Ͱهड़͢Δ
(T1) ఆ a,b, ... ɺม X, Y,... ߲
(T2) t1 , .., tn ͕߲Ͱɺf ͕ n Ҿͷؔ߸ه
˰ f (t1 , ...., tn ) ߲
Λ࡞Γग़͢ߏࢠͰʮؔ߸هʯͱݺΕɺҾ߲ tj
ΛͱΔɻϦετͰؔ ]_|_[ ͯ͠ͱ߸هͷΈΛߟ͑Δ
୯ҰԽ θɿ มʹผͷ߲Λೖ͠ɺʮಉ͡ܗʯʹ͢Δ
ͦͷதͰ࠷Ұൠతͳͷ͕ ࠷൚୯ҰԽ (mgu) (*)
σʔλૢ࡞ʢΛআ͖ʣࣜʹର͢Δೖૢ࡞ɿ
ೖ θ = {X1 = t1 , ..., Xn = tn }, dom(θ) = {X1 , ..., Xn }
t1 τ = t2 τ ͳΔҙͷೖ τ ʹର͠ some ζ s.t. θζ = τ
ม X = t ɿ
߲ t ͕ X Λ͚ͳ·ؚΕޭ͠ɺ
ೖ θ = {..., X = t, ...} ͷద༻ɿ ม Xj ΛؚΉࣜ s(Xj )
ೖ θ = {X = t} Λ࣮ߦ͢Δ
ʹ͓͚Δ Xj ͷग़ݱΛҰ੪ʹʢಉ࣌ʹʣରԠ͢Δ߲ tj ʹ
ஔ͖ ࣜͨ͑s(tj ) Λग़ྗɻ݁Ռͷ߲Λ sθ ͱදه
g(s1 , ..., sm ) = f (t1 , ..., tn ) ͕ޭ
˱
ೖͷྫɿθ = { X=a, Y=[c] }
f(X,g(Y))θ = f(a,g([c]))
୯ҰԽɿ ߏจతͳύλʔϯϚονϯά
[a,X,Y,b]θ = [a,a,[c],b]
ೖͷ߹ɿ ೖɺ߲Λೖྗͱͯ͠ɺ߲Λฦ͢ʮࣸ૾ʯ
Αͬͯɺࣸ૾ͱͯ͠ͷ߹͕Մೳ
θτ = {X = Xθτ | X ∈ dom(θ)}
∪{Z = Zτ | Z ∈ dom(τ ) \ dom(θ)}
ྫɿ { X=f(Y), Z=b } { Y=d } = { X=f(d), Y=d, Z=b }
f = g ʢಉ͡ Ͱ߸هn = mʣɺ͔ͭ
s1 θ = t1 θ, ..., sn θ = tn θ ͳΔ θ ͕ଘࡏ
?- f(X,g(X,Y)) = f(k(a,W),Z)
ෆҰக X ,k(a,W): θ1 ={X=k(a,W)}
?- f(k(a,W),g(k(a,W),Y)) = f(k(a,W),Z)
ෆҰக g(k(a,W),Y), Z: θ2 ={Z=g(k(a,W),Y)}
?- f(k(a,W),g(k(a,W),Y))
= f(k(a,W),g(k(a,W),Y))
ෆҰகແ͠ɿ ୯ҰԽޭ͠ɼθ = θ1 θ2
(*) ࠶൚ੑͷײతͳઆ໌ɿ
ෆҰக X = t ͷղফͷͨΊͷೖద༻ɼඞཁ࠷খݶͷૢ࡞ʢ༨ͱ͜ͳܭ͠ͳ͍ʣɽ
3
4
2.4
3
Ϧετͷ୯ҰԽ
Ϧετͷ୯ҰԽҰൠతͳ୯ҰԽΞ
ϧΰϦζϜʹै͏ɻϦετ্ه
ͷಛผͳུه๏ΛͭͷͰɺ͜͜
ૢ࡞తҙຯʢ࣮ߦܥʣ
͍ΘΏΔ ̝̾͆ ʢͲͷΑ͏ʹͯ͢͠ࢉܭΔ͔ɺॲࢉܭཧ͕
ਐߦ͢Δͷ͔ʣΛهड़
ཧޠݴܕͷ߹ɺSLD(Selectvie Linear Resolution for Def-
ͰԼهͷنଇͰߦ͏
(U1) ۭϦετ [] ͱϚον͢ΔϦε
τۭϦετͷΈɻ
(U2) [X]: Ϧετཁૉ͕୯Ұͳͷ
ͷΈͱϚον͢Δɻ
(U3) [X1,X2]: ̎ͭͷϦετཁૉ͔
ΒͳΔͷͷΈͱϚον͢Δɻ
ྫɿ
inite Clauses) ಋग़͕ඪ४త
ΰʔϧઅɿ ? − A1 , ..., An
͜Ε·ͰɼΫΤϦʔͱݺΜͩ
Aj ਖ਼Ϧςϥϧ p(t1 , ..., tn )
p ड़ޠʢؔΛද͢߸هʣɼtj σʔλΛද߲͢
ෛϦςϥϧ \ + p(t1 , ..., tn ) \+ ൱ఆ
ਖ਼ϦςϥϧΛ୯ʹΞτϜʢࢠݪཧࣜʣɽ
มΛ͖ͱ͍ͳ·ؚɼجఈΞτϜ (ground atom)
[X1,X2]=[a,[b,c]] ˰ X1=a, X2=[b,c]
[X1,X2]=[X] ୯ҰԽࣦഊɻಉ༷ʹɺ
[X] =[X1|X2] X=X1, X2=[] Ͱޭɻ
[X1,X2]=[Z1|Z2] X1=Z1, Z2=[X2] Ͱޭ
ҰൠʹɺϦετ [a1,....,an]=[X|Y] ʹର͠X=a1, Y=[a2,...,an]
ͱͳΔɻʢͨͩ͠ n ≥ 1 Ͱ n = 1 ͷͱ͖ Y=[]. ͭ·Γ
[a1,a2,...,an]=[a1|[a2,...,an]]
ϓϩάϥϜ P : ҎԼͷϧʔϧͷॱংू߹ʢॻ͔Εͨॱʣ
֬ఆઅ A : −B1 , ..., Bm ʢm ≥ 0ʣ
A: ਖ਼Ϧςϥϧɺϔου
Bj : ਖ਼ϦςϥϧͰɺB1 , ..., Bm ຊମʢϘσΟɼ݅෦ʣ
A, B1 , ..., Bm ͕શͯมΛ͖ͱ͍ͳ·ؚɼجఈϧʔϧ
ϧʔϧɿ ֬ఆઅɼ͘͠ຊମதʹෛϦςϥϧΛ͢ڐͷ
ΰʔϧઅΛɺΰʔϧϦμΫγϣϯʹΑΓɺม͢ܗΔաఔ͕ܭ
ࢉաఔʢളʣ
5
6
3.1
ΰʔϧϦμΫγϣϯʢෛϦςϥϧ͕ݱΕͳ͍߹ʣ
ΰʔϧઅதͷϦςϥϧΛબ͠ͳ͕Βɺϧʔϧͷ಄෦ͱ୯Ұ
3.2
ೖͷ߹ͱղೖ
?- A1 θ, ..., Ak−1 θ, B1 θ, ..., Bn θ, Ak+1 θ, ..., Am θ.
?- app([X],[b,c],Res)
app([X|Xs],Ys,[X|Zs]) :- app(Xs,Ys,Zs)
มɿ app([X1|X1s],Y1s,[X1|Z1s]) :- app(X1s,Y1s,Z1s)
θ1 = { X1=X, X1s=[], Y1s=[b,c], Res=[X|Z1s] }
?- app([],[b,c],Z1s)
app([],Xs,Xs).
มɿapp([],X2s,X2s)
θ2 = { X2s=[b,c], Z1s = [b,c] }
˘
͜ͷૢ࡞Λɺ̙̙̗Ͱઆ໌ͨ͠Α͏ʹɺ
ೖͷ߹ͱղೖ ্هͷΑ͏ʹɺΰʔϧϦμΫγϣϯʹΑ
Խ͠ɺϧʔϧͷຊମ෦ʹஔ͖͑Δૢ࡞
?- A1 , ..., Ak−1 , Ak , Ak+1 , ..., Am .
ͨͩ͠ɺϧʔϧ A : −B1 , ..., Bn ͱɺ
A : −B1 , ..., Bn ΰʔϧઅ : −A1 , ..., Am ͷม͕িಥ
θ s.t. Ak θ ≡ Aθ ͕ͳ͍Α͏ʹɺࣗಈͰม໊ͷ໊લସ
Λߦ͏ʢมʣ
ۭઅ ˘ ͕ಋग़͞ΕΔ·Ͱଓ͚Δ
Γɺೖͷ ྻܥθ1 , ..., θk ͕ಘΒΕΔ
͜ΕΒͷೖΛશͯ߹ͨ͠ͷ
?- app([X],[b,c],Res)
app([X|Xs],Ys,[X|Zs])
ྫɿ Ϧετͷ࿈
:-app(Xs,Ys,Zs).
app([],Xs,Xs).
ม
app([X|Xs],Ys,[X|Zs])
app([X1|X1s],Y1s,[X1|Z1s])
:-app(Xs,Ys,Zs).
:- app(X1s,Y1s,Z1s).
В 1={ X1=X, X1s=[], Y1s=[b,c],
Res=[X|Z1s]}
?- app([],[b,c],Z1s)
app([],Xs,Xs).
มɿ app([],X2s,X2s).
В 2={ X2s=[b,c], Z1s = [b,c] }
˘
7
θ = θ1 . . . θk ΛղೖͱͿݺ
{X1=X, X1s=[], Y1s=[b,c], Res=[X|[b,c]],
X2s=[b,c], Z1s = [b,c]}
ಛʹɺτοϓΰʔϧதͷมʢ͜ͷ߹ X, Resʣʹ੍͠ݶ
ͨͷ͕࠷ऴతͳ͑ͱͯ͠දࣔ͞ΕΔ
Res = [X|[b,c]] = [X,b,c], X=X
8
3.3
3.4
ࢉज़ࣜ̍ɿ ྻ
ࢉज़ࣜ̎ɿ ܁ฦ͠Λ༻͍ͨྻ
खଓ͖Ͱޠݴܕ while จͳͲΛ͏
X is t ʢX มɼt ࢉज़ࣜʣਖ਼Ϧςϥϧ
ྫɿ X is Y2*Z+.
ॳظ (1 = a0 , 1 = a1 , 1)
”is” Ϧςϥϧ͕બ͞ΕΔͱɼ
ӈลͷ v ΛٻΊɼ୯ҰԽɿ X = v
repeat
(v1 = an−1 , v = an , n)
⇓
(an = v, an+1 = v1 + v, n + 1)
until x = n
ϑΟϘφονྻɿ a0 = a1 = 1, an = an−1 + an−2
ԼهϓϩάϥϜɼྻͷఆٛͦͷͷ
f(0,1).
f(1,1).
f(X,Y) :- N1 is X-1, f(N1,R1),
N2 is X-2, f(N2,R2), Y is R1+R2.
?- f(2,Y).
?- N1 is 2-1, f(N1,R1), N2 is 2-2, f(N2,R2), Y is R1+R2.
with N1=1
?- f(1,R1), N2 is 2-2, f(N2,R2), Y is R1+R2.
with R1=1
?- N2 is 2-2, f(N2,R2), Y is 1+R2.
with N2=0
?- f(0,R2), Y is 1+R2.
with R2=1
?- Y is 1+1.
with Y = 2
˘
ೖͷ߹ɿ N1=1, R1=1, N2=0, R2=1, Y=2
top level query ʹ੍ͨ͠ݶղೖɿ Y=2.
9
f(0,1).
f(1,1).
f(X,R)
:- X > 1, g(1,1,1,X,R).
g(R2,R1,N1,X,R)
:- N1 = X, R=R1.
g(R2,R1,N1,X,R)
:- N1 < X, NN1 is N1+1,
NR1 is R2+R1,
g(R1,NR1,NN1,X,R).
?-f(4,R).
?-g(1,1,1,4,R).
...
?-g(1,2,2,4,R).
...
?-g(2,3,3,4,R).
...
?-g(3,5,4,4,R).
˘
R=5
static int fib(int x) {
if (x==0 || x==1) return 1;
int vnminus1 = 1, vn = 2, n = 2;
while (n != x) {
int tmp=vnminus1;
vnminus1 = vn;
vn = tmp+vn;
n++;
};
return vn;
}
ஸɼwhile จͷதؒม͕ɼ
ड़ޠͷҾʹରԠ
ʢྫɿ v1 g ͷୈ̍Ҿʣ
தؒมͷΛɼड़ޠͷҾʹݱ
ΕΔͱͯ͠อ͍࣋ͯ͠Δɽ
10
3.5
બʹؔ͢Δଋࣄ ʵ Prolog ͷ߹
3.6
όοΫτϥοΫͱࣦഊʹΑΔ൱ఆʢෛϦςϥϧͷॲཧʣ
̍ɽϧʔϧͷબॻ͔Εͨॱʹɼ
̎ɽΰʔϧઅதͷϦςϥϧͷબࠨ͔Βӈ
ࣦഊΰʔϧઅ ˔
̏ɽ݁ہɼΰʔϧઅͷ࠷ࠨϦςϥϧͱ
Ͳͷϧʔϧద༻ෆೳ
୯ҰԽՄೳͳ࠷ॳͷϧʔϧ͕બ
ʢΰʔϧઅதͷʢ࠷ࠨʣϦςϥϧ͕
࠶ࢼߦͷࡍɼ୯ҐԽՄೳͳϧʔϧΛॱ࣍બ
Ͳͷϧʔϧͷϔουͱ୯ҰԽͰ͖ͳ͍ʣ
? − A ͔Βͷ͕ࢉܭແݶϧʔϓʹؕΔ߹
࠶ࢼߦͱόοΫτϥοΫͷҰൠ
ࢼߦ͖͢ϧʔϧ͕͍ͬͯΔݶΓ࠶ࢼߦ
edge(a,b). edge(b,c)
path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z),
path(Z,Y).
path(X,Y) :- path(Z,Y), edge(X,Z).
path(X,Y) :- edge(X,Y).
Γͷϧʔϧ͕ͳ͍ͱ͖ɼΰʔϧઅʹΔ
ෛϦςϥϧ \ + A ͷॲཧ
?-path(a,c).
?-path(Z,c),edge(a,Z).
?-path(Z1,c),edge(Z,Z1), edge(a,Z).
?-path(Z2,c),edge(Z1,Z2),
edge(Z,Z1), edge(a,Z).
...
?-path(a,c).
?-edge(a,Z),path(Z,Y).
?-path(b,c).
?-edge(b,c).
˘
...
ΰʔϧઅ ? − \ + A , A2 , ..., An
? − A Λτοϓΰʔϧʹηοτ
? − A ͕༗ࣦݶഊ ˱ def ˘ʹࢸΔύεΛͣ·ؚɼ
ແݶͷύε͕ଘࡏ͠ͳ͍
?−A ͕ ༗ࣦݶഊ ˰ \ + A ޭ
࣍ͷΰʔϧઅ A2 , ..., An ɽ(ೖۭೖ)
? − A ͕ޭʢ˘Ͱऴྃʣ ˰ \ + A ࣦഊ͠
Ұͭલͷΰʔϧ
11
12
3.7
4
ෛϦςϥϧͷॲཧɿ ྫ
like(a,b). like(b,a). like(a,c).
p(a). p(b).
like(X,X). // X likes X, p(X): X is a person
dislike(X,Y) :- p(Y), \+ X=Y, \+ like(X,Y)
// X ʹର͠ Y ΛٻΊΔࡍɼ
// p(Y) Ͱ Y ΛఆԽͨ͠ʹޙෛϦςϥϧΛ࣮ߦ
?- dislike(b,Y).
?- p(Y), \+Y=b, \+ like(b,Y)
p(a), \+a=b
?- \+ like(b,a)
࠶ࢼߦ
p(b),
p(c).
?-dislike(a,Y)
?-\+ like(a,Y)
?-like(a,Y) ޭ
ෛϦςϥϧͷ࠶ࢼߦͰ͖ͳ͍
dislike(a,Y) ༗ࣦݶഊ
4.1
ྫ̍ɿ సϓϩάϥϜ̍
rev([],[]).
rev([X|Xs],Zs) :- rev(Xs,Ws),
app(Ws,[X],Zs).
app([],X,X).
app([X|Xs],Ys,[X|Zs]) :- app(Xs,Ys,Zs).
࠶ࢼߦ
b=b
p(c), \+c=b
?- \+ like(b,c)
˘ Y=c ͕͑
൱ఆड़ޠͷ࣮ߦͷલʹ Πϯελϯε ?-dislike(c,Y)
Խ͠ͳ͍ͱͲ͏ͳΔ͔ɽ
ɽ
ɽ
ྫ
?-\+ like(c,Y)
?- like(c,Y) ༗ࣦݶഊ
Y ͷೖͳ͠
˘ ʢޭʣ
?- rev([a,b],Res)
?- rev([b],W), app(W,[a],Res).
?- rev([],W1), app(W1,[b],W), app(W,[a],Res).
W1 = []
?- app([],[b],W), app(W,[a],Res).
W = [b]
?- app([b],[a],Res).
Res = [b|Res1]
?- app([],[a],Res1).
Res1 = [a]
˘
ೖͷ߹Λߦ͍ɺ
Res = [b|[a]]ɺͭ·ΓɺRes = [b,a] ͕͑
13
14
4.2
4.3
ྫ̎ɿ సϓϩάϥϜ̎
append ΛΘͳ͍όʔδϣϯ
ࠨ͔ΒॱʹཁૉΛநग़͠ͳ͕Β
ॱٯͷϦετΛ࡞Δ
ิॿม Acc ͷ༻
ߟ͑ํ ྻྫ̎ Ͱࣔͨ͠ͷ
ͱಉ͡
Acc
ೖྗ
-----------------------[a1,a2,a3,...,a9]
[]
[a2,a3,...,a9]
[a1]
[a3,...,a9]
[a2,a1]
...
[a9]
[a8,...,a2,a1]
[] [a9,a8,,...,a2,a1]
----------------------ೖྗ͕ [] ͷͱ͖ͷ Acc ͕͑
rev(Xs,Ys) :- auxrev(Xs,[],Ys).
auxrev([],Acc,Acc).
auxrev([X|Xs],Acc,Ys) :- auxrev(Xs,[X|Acc],Ys).
?- rev([a,b],Ys)
?-auxrev([a,b],[],Ys).
?-auxrev([b],[a],Ys).
?-auxrev([],[b,a],Ys).
Ys = [b,a]
˘
ྫ̏ɿ ϋϊΠͷౝ
ϙʔϧ̿̍ʹ̽ຕͷԁ൫͕େ͖ͳॱʹੵ·Ε͍ͯΔʢਤͰ ̽ = ̏ʣɻ̿̍
ͷશͯͷԁ൫Λɺϙʔϧ̿̎Λͬͯϙʔϧ̿̏ʹҠ͠ͳ͍͞ɻͦͷࡍɺ
େ͖ͳԁ൫Λখ͞ͳԁ൫ͷ্ʹஔ͍͍͚ͯ·ͤΜɻ
[pi,pj] : ʰϙʔϧ ̿ i ͷҰ൪্ʹ͋Δԁ൫Λ ϙʔ
ϧ ̿ j ʹҠಈͤ͞Δʱૢ࡞
Ұ࿈ͷҠಈૢ࡞ΛϦετͰදهɿ
p3 Λิॿͱͯ͠
p1 ͔Β̎ຕΛ p2
ͦͷޙɺ࠷େԁ൫Λ
p3 Ҡಈ
p1 Λิॿͱͯ͠ɺ
̎ຕΛ p3 Ҡಈ
[[p1,p3],[p1,p2],[p3,p2]]
্ه solve(2,p1,p2,Sol) ͷղ Sol
solve(ຕ, ࠷ॳͷϙʔϧ, ඪϙʔϧ, ղ)
solve(1,Pole1,Pole2,[[Pole1,Pole2]]).
// 1 ຕͷͱ͖ɺ୯ʹҠಈͤ͞ΔͷΈɻ
solve(N,Spole,Tpole,Solution) :N > 1, N1 is N-1, // N > 1 ద༻݅
ano_pole(Spole,Tpole,Wpole),
// ࡞༻ۀϙʔϧ Wpole
solve(N1,Spole,Wpole,Sub1),
BottomDisk = [Sploe,Tpole];
solve(N1,Wpole,Tpole,Sub2),
app(Sub1,[BottomDisk|Sub2],
Solution).
ิॿड़ͯ͠ͱޠɺϦετͷ࿈ appɺ͓Αͼ
ิॿϙʔϧʹؔ͢Δهड़ ano_pole Λ༻͍Δɿ
ano_pole(p1,p2,p3).
ano_pole(p1,p3,p2).
ano_pole(p2,p1,p3).
ano_pole(p2,p3,p1).
ano_pole(p3,p1,p2).
ano_pole(p3,p2,p1).
15
16
4.4
4.5
ྫ̐ɿ ܦ࿏୳ࡧ̍
b
༗άϥϑ̜ɿ ϊʔυͷू߹ V ͱ
Τοδͷू߹ E ⊆ V × V ͷର
(a, b) ∈ E ˱ a ͔Β b ͷ͖
͖ͷล (Τοδ)
͔࢝Βऴʢతʣ·Ͱͷܦ࿏
(path) ΛٻΊΔ
d
a
ॳظϊʔυ ͔Β ϊʔυ Node1 ʹ͍ͨΔதؒ࿏ Acc Λอ࣋
f
c
ྫ̑ɿܦ࿏୳ࡧ̎
adj(Node1, Inode) ͳΔ Inode ͕ Acc ্͔ΛνΣοΫ
νΣοΫʹޭ͢Ε, Inode Λ Acc ʹՃ
e
ड़ ޠcsearch(+Node1, +Node2, +Acc, -Path)
adj(a,b). adj(a,c). adj(b,c).
adj(b,d). adj(c,e). adj(e,f).
ܦ࿏ n1,...,nk ΛϦετ [n1,...,nk] Ͱදݱ
Acc ʹ͜Ε·Ͱ๚Εͨ nodes Λੵ͓ͯ͘͠ɻ
search(Node1,Node2,Path)
:- csearch(Node1,Node2,[Node1],Path).
search(+Snode, +Target, -Path)
࠶ؼతϓϩάϥϛϯά͜͜Ͱ༗ޮ
search(Node,Node,[Node]).
search(Node1,Node2, [Node1|Path])
:- adj(Node1,Inode),
search(Inode,Node2,Path).
ด࿏ΛؚΉ߹ɺແݸݶͷղ
adj(a,b). adj(b,c). adj(c,a).
͜ͷͱ͖ɺ
search(a,a,[a]).
search(a,a,[a,b,c,a]).
search(a,a,[a,b,c,a,b,c,a]).
....
17
csearch(Node,Node,Acc,[Node]).
csearch(Node1,Node2,Acc,[Node1|Path])
:- adj(Node1,Inode),
not_on(Inode,Acc),
csearch(Inode,Node2, [Inode|Acc],Path).
not_on(Inode,Acc):- \+ mem(Inode,Acc).
mem(Inode,[Inode|Nodes]).
mem(Inode,[Node|Nodes])
:- \+ Inode=Node,
mem(Inode,Nodes).
18
·ͨ
not_on(Inode,[]).
not_on(Inode,[Node|Nodes])
:- \+ Inode=Node,
not_on(Inode, Nodes).
5
એݴతҙຯɼૢ࡞తҙຯ
5.1
એݴతҙຯ: ࠷খෆಈϞσϧ
ૢ࡞తҙຯɿ ͲͷΑ͏ͳτοϓΰʔϧઅ͕ϓϩάϥϜͷԼ
Ͱޭ͢Δ͔ʢ˘અͷϦμΫγϣϯΛ͔࣋ͭʣʁ
એݴతҙຯɿ
ϓϩάϥϜ̥ʹଐ͢Δશͯͷϧʔϧ A : −B1 , ..., Bn ʹ
ର͠ɼB1 , ..., Bn ͕ਖ਼͚͠ΕɼA ਖ਼͍͠ɽ
ʮਖ਼͠͞ʯཧཧֶͰ͍͏ɼ
ʮϞσϧʯɼ
ʮཧత݁ؼʯ
ͱͯ͠ਖ਼֬ʹఆٛ͞ΕΔ͕ɼຊߨͰɼಛผͳϞσϧͰ
͋Δ࠷খෆಈϞσϧʹݶఆͯ͠͡Δ
݈શੑɿޭ͢Δΰʔϧਖ਼͍͠ʢ࠷খෆಈϞσϧʹଐ
͢Δʣ
શੑ (*)ɿ ਖ਼͍͠ͷɺϓϩάϥϜͷԼͰޭ͢Δʢۭ
અΛಋग़Ͱ͖Δʣ
࡞༻ૉ TP : 2GA → 2GA , GA: جఈΞτϜશମɻ
(*) ೖྗ͔Βग़ྗΛٻΊΔϓϩάϥϜͷશੑɼޙड़͢Δʮlifting lemmaʯΛ༻͍ΕɼͪʹಘΒ
ΕΔɽ
}
TP (A) = {α ∈ GA | ∃ θ s.t. (A : −B1 , ..., Bn ) ∈ P,
α ≡ Aθ, {B1 θ, ..., Bn θ} ⊆ A
TP ↑ (0) = φ, TP ↑ (n + 1) = TP (TP ↑ (n))
୯ௐੑ TP ↑ (n) ⊆ TP ↑ (n + 1) ΑΓ ू߹ྻͷ͕ݶۃଘࡏɿ
∞
TP ↑ (ω) = ∪ TP ↑ (n)
n=0
ਖ਼͍͠ͷɿ α ∈ TP ↑ (ω)
ਖ਼͘͠ͳ͍ͷɿ α ∈
/ TP ↑ (ω)
19
20
5.2
5.3
ള๏ͷ݈શੑ
มΛ͍ͳ·ؚΞτϜ α = p(t1 , ..., tk ) ʹର͠ɼ
શੑ̍ɿ มΛ͍ͳ·ؚΰʔϧ
∞
? − α ͔Β˘͕ಋग़͞ΕΔ ˰ α ∈ TP ↑ (ω).
?- r(a,b).
r(X1,X2) :p(X1,X3),
q(X3,X2).
X1=a, X2=b.
?-p(a,X3), q(X3,b). ള த
ͷม
p(a,Y1).
Λղ
X3=Y1
ೖʹΑ
?-q(Y1,b).
ΓҰ੪
ʹ۩ମ
q(Z1,b).
Խ
Y1=Z1.
˘
ղೖ X1=a, X2=b,
X3=Y1=Z1
˰
?- r(a,b).
r(a,b) :p(a,Z1),
q(Z1,b).
?-p(a,Z1), q(Z1,b).
p(a,Z1).
?-q(Z1,b).
Γͷ
q(Z1,b).
มΛ
˘
దʹ
˰
্هͷ SLD-ಋग़ɼ୯
ҰԽͷඞཁ͕ͳ͍ʢͭ
·Γɼղೖ͕ۭೖʣ
͜ͱʹҙɽ
·ͨҰൠʹɼඇجఈ߲
͕ग़͢ݱΔ͜ͱ͋Γ
ఆԽ
͢Δ
Z1=c
ള๏ͷશੑ
α = p(t1 , ..., tn ) ∈ TP ↑ (ω) = ∪ TP ↑ (n)
n=1
˰ ? − α ͔Βۭઅ ˘ ͷ SLD ള͕ଘࡏ͢Δ
શੑ̎ɿ Aθ = α ∈ TP ↑ (ω) ˰ ? − A ͔Βͷ ղೖ τ
?- r(a,b).
r(a,b) :p(a,c),
q(c,b).
?-p(a,c), q(c,b)
p(a,c).
?-q(c,b).
q(c,b).
˘
q(c,b) ∈ Tp ↑ (1).
p(a,c) ∈ Tp ↑ (1).
r(a, b) ∈ Tp ↑ (2).
Λ࣋ͭ SLD ളͱ͋Δೖ ρ ͕ଘࡏ͠ɼτοϓΰʔϧ A
தͷҙͷม X ʹର͠ɼXθ = Xτ ρ ཱ͕
ҙɿ ളͷʮࠨଆʯʹແݶύε͕ଘࡏ͢Δ߹͋Δɽ
p(X,Y):-q(Y,Z)
p(a,b):-q(b,c)
some n s.t. α ∈ TP ↑ (n) ͔ͩΒɼ໋Ϩ
ϕϧͷളΛߏɿ جఈϧʔϧΛ༻͍ͨ
ΰʔϧϦμΫγϣϯ ̡
p(a,b)
ඪͱ͢ΔΰʔϧϦμΫγϣϯɿ جఈԽ
͞Εͳ͍ϧʔϧΛ༻͍ͨϦμΫγϣϯ ̧ɽ
୯ҰԽͷ࠷൚ੑʹҙ͠ɼ
θ1 = θ ∪ {X = a, Y = b, Z = c}, V θ1 = b
θ1 = τ1 ρ1 . ಛʹɼ V θ1 = V τ1 ρ1
ρ1 = τ2 ρ2 .
ʹނɼ b = V θ1 = V τ1 ρ1 = V τ1 τ2 ρ2 = V τ ρ2
͑Δ
̡ͱಉ͡͞ͷ̧͕ߏ͞Εɼ̧ͷ࠷ޙ
ͷΰʔϧઅۭઅ ˘
Note: ʹີݫϦμΫγϣϯͷ͞ʢஈʣʹؔ
͢Δֶతؼೲ๏
جఈೖ θ1 , θ2 .
ม͔݅Β θ = θ1 ∪ θ2 ͱॻ͚Δ.
B1 θ = B1 θ1 = β1 = Aθ2 = Aθ
so mgu τ ʹରͯ͠ɼsome ρ s.t. τ ρ = θ
21
22
q(b,Z)
q(b,c)
6
ԋश
Q1: ཧϓϩάϥϜͷએݴతҙຯͱૢ࡞తҙຯͱͲͷΑ͏ͳͷ͔Λ؆ܿʹड़Α
Q2: ༗άϥϑͷล͕ਖ਼ͷॏΈΛ࣋ͭͱ͖ʹɼ͔࢝Βऴͷܦ࿏ͱͦͷॏΈʢ֤ลͷॏ
Έ૯ʣΛٻΊΔϓϩάϥϜΛॻ͖ɼͦͷࢉܭաఔΛྫࣔ͠ͳ͍͞ɽ
Q3: Լهͷ rev ɼୈ 1 ҾͷϦετʹରͯ͠ɼͲͷΑ͏ͳୈ 2 ҾͷϦετΛฦ͔͢Λઆ
໌͠ͳ͍͞ɽ
list([]).
list([_|Xs]):- list(Xs).
app([],Y,Y). app([X|Xs],Ys,[X|Rs]):-app(Xs,Ys,Rs).
forElement(X,X):-atomic(X).
// atomic(X) ఆͷͱ͖ޭɼͦΕҎ֎Ͱࣦഊ͢ΔγεςϜड़ޠ
forElement(X,R):-list(X), rev(X,R).
rev([],[]).
rev([X|Xs],Res):rev(Xs,RXs), forElement(X,RX), app(RXs,[RX],Res).
Q4. ͷग़ՙঢ়ؔ͢ʹگΔখ (1),(2) ͷϧʔϧΛॻ͖ɼԼهͷσʔλΛ༩͑ͨͱ͖ͷ
ಈ࡞Λઆ໌͠ͳ͍͞ɽͨͩ͠ɼship(X,Y) ʰ X Y Λग़ՙʱΛද͢ɽ
factory(a). factory(b). factory(c).
product(x). product(y). product(z).
ship(a,y). ship(b,y). ship(b,z),
ship(c,x). ship(c,y). ship(c,z).
factory(d).
(1) Ͳͷग़ՙ͍ͯ͠ͳ͍ΛٻΊΔϧʔϧ
(2) શͯͷΛग़ՙ͍ͯ͠ΔΛٻΊΔϧʔϧ
23
© Copyright 2025 Paperzz