現在の閲覧者数:

猿とバナナ

部屋の中央にあるバナナを猿が取れるか?


---------------------------------------------------------------------------------------------------

【前もって Prolog の変数を定義】
'状態'( _猿の水平位置, _猿の上下位置, _箱の水平位置, _猿がバナナを持っているか ).
'動作'( '状態A', _動作, '状態B' ).


---------------------------------------------------------------------------------------------------

【初期状態】
部屋の中央にバナナがある。
猿が箱に乗れば取れる位置にある。



猿は、ドアの位置にいる。
猿は、床にいる。
箱は、窓際にある。
猿は、バナナを持っていない。

Prolog で定義。
'状態'( 'ドア', '床', '窓', '持っていない' ).

【最終状態】
[猿が]バナナを持っている。

Prolog で定義。
'状態'( _, _, _, '持っている' ).

【猿の取りうる動作】


---------------------------------------------------------------------------------------------------
[取る]
'動作'( '状態'( '中央', '箱', '中央', '持っていない' ), '取る', '状態'( '中央', '箱', '中央', '持っている' ) ).

解説:猿と箱の水平位置は中央。猿は箱の上にいる。持っている状態のみ変化。


---------------------------------------------------------------------------------------------------
[乗る]
'動作'( '状態'( A, '床', A, D ), '乗る', '状態'( A, '箱', A, D ) ).

解説:猿と箱の水平位置は同じ。移動しない。バナナを持っているか持っていないか関係ない。猿の上下位置のみ変化。


---------------------------------------------------------------------------------------------------
[押す](箱と一緒に動く)
'動作'( '状態'(A1, '床', A1, D ), '押す'( A1, A2 ), '状態'( A2, '床', A2, D ) ).

解説:A1地点から A2地点へ押す。その時:床の上で押す。:猿と箱の水平位置は同じ。:バナナを持っているか持っていないか関係ない。


---------------------------------------------------------------------------------------------------
[歩く](箱は静止)
'動作'( '状態'( A1, '床', C, D ), '歩く'( A1, A2 ), '状態'( A2, '床', C, D ) ).

解説:A1地点から A2地点へ歩く。その時:床の上を歩く。:箱の水平位置は変わらない。:バナナを持っているか持っていないか関係ない。



---------------------------------------------------------------------------------------------------

【Prolog への質問】
'バナナを取ることができる'( '状態'( _, _, _, '持っている' ) ).
'バナナを取ることができる'( _状態1 ) :- '動作'( _状態1, _動作, _状態2 ), 'バナナを取ることができる'( _状態2 ).


以上を整理してプログラムコードにします。

♪ プログラムコード code

% cat saru_banana.pl 


'動作'( '状態'( '中央', '箱', '中央', '持っていない' ), '取る', '状態'( '中央', '箱', '中央', '持っている' ) ).
'動作'( '状態'( A, '床', A, D ), '乗る', '状態'( A, '箱', A, D ) ).
'動作'( '状態'(A1, '床', A1, D ), '押す'( A1, A2 ), '状態'( A2, '床', A2, D ) ).
'動作'( '状態'( A1, '床', C, D ), '歩く'( A1, A2 ), '状態'( A2, '床', C, D ) ).
'バナナを取ることができる'(  '状態'( _, _, _, '持っている' ) ).
'バナナを取ることができる'( State1 ) :- '動作'( State1, _, State2 ), 'バナナを取ることができる'( State2 ).

main :-  write( '\'バナナを取ることができる\'( \'状態\'( \'ドア\', \'床\', \'窓\', \'持っていない\' ) .'   ), nl, nl,
            'バナナを取ることができる'( '状態'( 'ドア', '床', '窓', '持っていない' ) ),
            write( '猿はバナナを取ることが出来る!!' ), !.
main :- write( '猿はバナナを取ることが出来きない!!' ), !.



実行例

% swipl -sq saru_banana.pl
?- main.
'バナナを取ることができる'( '状態'( 'ドア', '床', '窓', '持っていない' ) .

猿はバナナを取ることが出来る!!
true.

?- halt.
%     

inserted by FC2 system