back numbers

5.29.2008

リストで書き直すのこと

変更部分だけ。

% monstres/1
monstres(['焼きたてパン', '強いシャチホコ', 'もんじゃ焼き一年生',
'怪人ホタテ男', 'ニセ勇者', '逃げ足の早いアレ', '睡魔', '煩悩',
'愛らしい子犬の中の人', '恋するスズメバチ', '勇敢なクマンバチ',
'信じられない物','勇者の師匠', '浮遊する鎧', '怪盗ドボン',
'闇の招き猫', '誘惑のカスタードクリーム', 'しょっぱすぎる籠手',
'カレー味の兜', '光沢だけは一流の盾', '若葉マークのモンスター',
'新緑の季節', '梅雨時の車両のニオイ', '暑すぎる夏', '新宿らしき何か',
'やたら発達したドーナツ', '育ちすぎたクマー', 'なごやかな雰囲気',
'凍り付いた気配', '忍び寄る恐怖']).

% competences/1
competences(['お豆腐の買い方', '鉛筆の買い方', '消しゴムの使い方',
'メモの取り方', '攻撃に使えないこともない呪文', '裏道の歩き方',
'森林浴', '珈琲の味', 'しじみのみそ汁の作り方', '回覧板の回し方',
'郵便物の投函方法', '立ち話のコツ', '猫の呼び方', '犬の呼び方',
'カラスの呼び方', '鳩専用豆鉄砲', '秘密の趣味', '速く走るコツ',
'剣の使い方', '斧の使い方', 'まきわりで、まっきわりわり',
'聖なる祈り', '孤独', '涼しく過ごすコツ', 'お洒落のコツ',
'卵をふわっと焼く方法', 'ごはんの研ぎ方', '油汚れの対応方法',
'大人の振るまい', 'Suicaの使い方']).

% nth/3
nth([X|_], 0, X).
nth([_|Xs], N, X) :-
N > 0, N1 is N - 1,
nth(Xs, N1, X).

% aventure/0
aventure :-
monstres(Monstres), length(Monstres, Lm),
competences(Competences), length(Competences, Lc),
repeat,
niveau(Niveau),
(niveau_limite(Niveau) -> !;
I1 is random(Lm) + 1, nth(Monstres, I1, Monstre),
I2 is random(Lc) + 1, nth(Competences, I2, Competence),
factoriel(Niveau, Experience),
que_vous_avez_eprouve(Monstre, Experience),
qui_votre_niveau_haut(Niveau, Competence),
nl, sens_omission, nl, sleep(2), fail),
que_vous_avez_dernier.

リスト表記でデータを持った方が簡単にはなるが、これでは論理的という感じがあまりしない。これではモンスターごとに新しくを機能を振るとなったとき、例えばこんな感じで拡張する必要が出てくる。

% monstres([(name/hp/str)])
monstres([('焼きたてパン'/100/7), ('強いシャチホコ'/350/15), ...]).

そうしないとリストを走査する際のロジックが書き難いからだ。ところがもしこれが分かれていれば、

monstre('焼きたてパン', 100/7/Skill) :-
heal(Skill).
monstre('強いシャチホコ', 350/15/Skill) :-
jump(Skill);
attack(Skill);
run_away(Skill).

という具合に、実行パスの分節点として機能させる事が出来る。このように個々のデータさえ、実行(あるいは評価)可能なプログラムの断片になっているのが論理型言語の良さなのだから、前の方がPrologらしいに決まっているのだ。

0 件のコメント:

tags

Profile

Taito, Tokyo, Japan
明けども明けども次の埒
hiro.kosh@gmail.com