このディレクトリの索引

% <<問題2>>「論理少女1」つじ要作 というマンガの中に出てくる問題です。 % 4箇所の隠し場所と4つのアイテム(お金)は>>62と同じですが、 % 隠す場所は一度ご破算にします。以下のヒントを読んで、 % できるだけ問題文に忠実な表現になるようにプログラミングしてください。 % 1) 髪の中かスカートのポケットのどちらか一万円札が入っている % 2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍 % 3) 百円玉は千円札より上の位置にある % 4) 靴の中のお金は髪の中のお金の100倍 % そして、1)..4)のうちどれかが嘘。 % それでは、 % 靴の中のお金は? % :- op(800,xfx,は). :- op(650,xfx,の). :- op(250,xf,円). 隠した物([一万円札,千円札,百円玉,十円玉]). 隠した場所([髪の中,胸のポケット,スカートのポケット,靴の中]). 髪の中 は 胸のポケット の 直ぐ上にある. 胸のポケット は スカートのポケット の 直ぐ上にある. スカートのポケット は 靴の中 の 直ぐ上にある. A は B の 上にある :- A は B の 直ぐ上にある. A は B の 上にある :- A は C の 直ぐ上にある,C は B の 上にある. お金(一万円札,10000 円). お金(千円札,1000 円). お金(百円玉,100 円). お金(十円玉,10 円). '靴の中のお金は?'(_靴の中のお金) :- 解候補の生成(_解), 'そして、1)..4)のうちどれかが嘘。'('ヒント: 1) 髪の中かスカートのポケットのどちらか一万円札が入っている'(_解), 'ヒント: 2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍'(_解), 'ヒント: 3) 百円玉は千円札より上の位置にある'(_解), 'ヒント: 4) 靴の中のお金は髪の中のお金の100倍'(_解)). 解候補の生成(_解) :- '隠した物、隠した場所、隠した物の要素数'(_隠した物リスト,_隠した場所リスト,_要素数), 順列(_隠した物リスト,_要素数,_物候補), 解候補の生成(_隠した場所リスト,_物候補,_解). '隠した物、隠した場所、隠した物の要素数'(_隠した物リスト,_隠した場所リスト,_要素数) :- 隠した物(_隠した物リスト), 隠した場所(_隠した場所リスト), length(_隠した物リスト,_要素数). 解候補の生成([],_,[]). 解候補の生成([A|R1],[B|R2],[[A,B]|R]) :- 解候補の生成(R1,R2,R). 'そして、1)から4)の内 どれかが嘘。'(_1,_2,_3,_4) :- _1,_2,_3,\+(_4). 'そして、1)..4)のうちどれかが嘘。'(_1,_2,_3,_4) :- _1,_2,\+(_3),_4. 'そして、1)..4)のうちどれかが嘘。'(_1,_2,_3,_4) :- _1,\+(_2),_3,_4. 'そして、1)..4)のうちどれかが嘘。'(_1,_2,_3,_4) :- \+(_1),_2,_3,_4. 'ヒント: 1) 髪の中かスカートのポケットのどちらか一万円札が入っている'(_解) :- member([髪の中,一万円札],_解). 'ヒント: 1) 髪の中かスカートのポケットのどちらか一万円札が入っている'(_解) :- member([スカートのポケット,一万円札],_解). 'ヒント: 2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍'(_解) :- 胸のポケットに入っているお金は(_解,_胸のポケットに入っているお金), スカートに入ってるお金(_解,_スカートに入っ\てるお金), _胸のポケットに入っているお金 is _スカートに入ってるお金 * 10. 'ヒント: 3) 百円玉は千円札より上の位置にある'(_解) :- member([_百円玉の位置,百円玉],_解), member([_千円札の位置,千円札],_解), _百円玉の場所 は _千円札の位置 の 上にある. 'ヒント: 4) 靴の中のお金は髪の中のお金の100倍'(_解) :- 靴の中のお金は(_解,_靴の中のお金), 髪の中のお金の(_解,_髪の中のお金), '100倍'(_靴の中のお金,_髪の中のお金). 靴の中のお金は(_解,_靴の中のお金) :- member([靴の中,_物],_解), お金(_物,_靴の中のお金 円), 髪の中のお金の(_解,_髪の中のお金) :- member([髪の中,_物],_解), お金(_物,_髪の中のお金 円). '100倍'(_靴の中のお金,_髪の中のお金) :- _靴の中のお金 is _髪の中のお金 * 100. 胸のポケットに入っているお金は(_解,_胸のポケットに入っているお金) :- member([胸のポケット,_物],_解), お金(_物,_胸のポケットに入っているお金 円). スカートに入ってるお金(_解,_スカートに入ってるお金), member([_スカートのポケット,_物],_解), お金(_物,_スカートに入ってるお金 円). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X).