/* monkey-banana: Newell-Simon's GPS with simple NLP */ % 参照:I. Batko,「AIプログラミング」(安部・田中訳),近代科学社, 2.5節. % file: monkey.pl % created: 1998.10.13.Tue by K.INDO % modified: 29 Oct 2002. the program augmented with a simple NLP (natural language processing) in Japanese. % 猿の4動作--grasp(掴む), climb(箱の上に登る), push(箱を押す), walk(歩く) move(state( middle, onbox, middle, has_nothing), grasp, state(middle, onbox, middle, has_a_banana)). move(S1,climb,S2):- S1=state(P, onfloor, P, H), S1, S2=state(P, onbox, P, H), S2. move(S1, push( P1,P2), S2):- S1=state( P1, onfloor, P1, H), S1, S2=state( P2, onfloor, P2, H), P2\=P1, S2. move(S1, walk( P1,P2), S2):- S1=state( P1, onfloor, B, H), S1, S2=state( P2, onfloor, B, H), P2\=P1, S2. % 猿の計画立案 canget(Goal):- Goal=state( _,_,_, has_a_banana),Goal. canget(S):- canget(S1),move(S,_Move, S1). % 状態 initial_state(state(atdoor, onfloor, atwindow, has_nothing)). state(A, B, C, D):- member(A,[atdoor,middle,atwindow]), member(B,[onfloor,onbox]), member(C,[atdoor,middle,atwindow]), member(D,[has_nothing,has_a_banana]). % 猿の計画立案2 planget(Goal,[[Goal,satisfied]]):- Goal=state( _,_,_, has_a_banana),Goal. planget(S,[[S,M]|P]):- planget(S1,P),move(S,M, S1),S,\+member([S1,M],P). % 計画書き出し wp(Plan):- forall(nth1(K,Plan,P), ( write('時刻'(K)),nl,wa(P),nl ) ). wa([state(X,Y,Z,W),Move]):- '辞書'(monkey,A,'名詞','動作主体'), '辞書'(X,P,'名詞','位置'('水平方向')), '辞書'(Y,Q,'名詞','位置'('垂直方向')), '辞書'(W,State,'動詞','状態'), tab(3),write(A-'は'-P-Q-'において'-State),nl, '辞書'(box,B,'名詞','道具'), '辞書'(Z,R,'名詞','位置'('水平方向')), tab(3),write(B-'は'-R-'にある。'),nl, '辞書'(Move,Action,'動詞'), tab(3),write(A-'が'-Action),nl. /* NLP part */ % 動詞辞書 '辞書'(satisfied,'バナナを食べている。','動詞'). '辞書'(grasp,'バナナを掴む。','動詞'). '辞書'(climb,'箱の上に登る。','動詞'). '辞書'(push(X,Y),X1-'から'-Y1-'まで箱を押す。','動詞'):- '辞書'(X,X1,'名詞','位置'('水平方向')), '辞書'(Y,Y1,'名詞','位置'('水平方向')). '辞書'(walk(X,Y),X1-'から'-Y1-'まで歩く。','動詞'):- '辞書'(X,X1,'名詞','位置'('水平方向')), '辞書'(Y,Y1,'名詞','位置'('水平方向')). % 名詞辞書 '辞書'(monkey,'猿','名詞','動作主体'). '辞書'(box,'箱','名詞','道具'). '辞書'(banana,'バナナ','名詞','目標'). % 名詞辞書(位置) '辞書'(atwindow,'窓際','名詞','位置'('水平方向')). '辞書'(atdoor,'ドアの近く','名詞','位置'('水平方向')). '辞書'(middle,'部屋の中央','名詞','位置'('水平方向')). '辞書'(onfloor,'床の上','名詞','位置'('垂直方向')). '辞書'(onbox,'箱の上','名詞','位置'('垂直方向')). % 動詞辞書(状態) '辞書'(has_nothing,'何も持っていない。','動詞','状態'). '辞書'(has_a_banana,'バナナを持っている。','動詞','状態').