Comments
Description
Transcript
操作的・宣言的意味
ϓϩάϥϜཧͱ ޠݴ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