back numbers

5.29.2008

「憂鬱な勇者」を Prolog で

「憂鬱な勇者」を作った件
「憂鬱な勇者」がとても面白かったので、 Scheme に移植してみた
「憂鬱な勇者」を Squeak Smalltalk で
「憂鬱な勇者」を C# で
という一連の勇者の冒険に心ときめいたDQ世代の私も便乗してみた。

:- encoding(utf8).

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

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

% que_vous_avez_eprouve/2
que_vous_avez_eprouve(Monstre, Experience) :-
write(Monstre), write('を倒した!'),
write(Experience), write('の経験値を得た。'), nl.

% qui_votre_niveau_haut/2
qui_votre_niveau_haut(Niveau, Competence) :-
write('勇者は'), write(Niveau), write('にレベルが上がった!'),
write('勇者は'), write(Competence), write('を覚えた。'), nl.

% que_vous_avez_dernier/0
que_vous_avez_dernier :-
write('勇者は、また、レベルが上がった!'),
write('勇者は、ふと空しさを覚えた。'), nl.

% sens_omission/0
sens_omission :-
write('そして、かくかくしかじかで、山あり谷ありの冒険が続いたが割愛。'), nl.

% factoriel/2
factoriel(0, 1).
factoriel(N, A) :-
N > 0, N1 is N - 1,
factoriel(N1, A1),
A is N * A1.

% niveau_limite/1
niveau_limite(30).

% niveau/1
niveau(1).
niveau(N) :- niveau(N1), N is N1 + 1.

% aventure/0
aventure :-
findall(Nom, monstre(Nom), Monstres), length(Monstres, Lm),
findall(Nom, competence(Nom), Competences), length(Competences, Lc),
repeat,
niveau(Niveau),
(niveau_limite(Niveau) -> !;
I1 is random(Lm) + 1, nth_clause(monstre(_), I1, R1), clause(monstre(Monstre), _, R1),
I2 is random(Lc) + 1, nth_clause(competence(_), I2, R2), clause(competence(Competence), _, R2),
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.

ソースはUTF-8で保存して、処理系はSWI-Prolog Version 5.5.xx以降にする必要あり。あえてリストを(一部を除き)使わない実装にしてみたが、まわりくどくなってしまった気がする。さらにrandom/1はISO-Prologですらない。この辺りはPrologの普及度の低さを強く体言しているといえる。

にしても、こんなことしていたから昼飯喰い逃してしまった。まぁ昼休みは従業員の自由時間なのだから、どう使おうと勝手だろうが。

0 件のコメント:

tags

Profile

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