このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/172
# 論理の問題ですが
#
# 95年「ここ数年で一番出来が良い」
# 96年「10年に1度の逸品」
# 97年「1976年以来の品質」
# 98年「10年に1度の当たり年」
# 99年「品質は昨年より良い」
# 00年「出来は上々で申し分の無い仕上がり」
# 01年「ここ10年で最高」
# 02年「過去10年で最高と言われた01年を上回る出来栄え」「1995年以来の出来」
# 03年「100年に1度の出来」「近年にない良い出来」
# 04年「香りが強く中々の出来栄え」
# 05年「ここ数年で最高」
# 06年「昨年同様良い出来栄え」
# 07年「柔らかく果実味が豊かで上質な味わい」
# 08年「豊かな果実味と程よい酸味が調和した味
# 09年「50年に1度の出来栄え」
#
# です

% とにもかくにも、こんな述語を一度構成しましょう。何をするかはそれから。

'ボージョレ・ヌーボーの謳い文句'('95年','ここ数年で一番出来が良い').
'ボージョレ・ヌーボーの謳い文句'('96年','10年に1度の逸品').
'ボージョレ・ヌーボーの謳い文句'('97年','1976年以来の品質').
'ボージョレ・ヌーボーの謳い文句'('98年','10年に1度の当たり年').
'ボージョレ・ヌーボーの謳い文句'('99年','品質は昨年より良い').
'ボージョレ・ヌーボーの謳い文句'('00年','出来は上々で申し分の無い仕上がり').
'ボージョレ・ヌーボーの謳い文句'('01年','ここ10年で最高').
'ボージョレ・ヌーボーの謳い文句'('02年','過去10年で最高と言われた01年を上回る出来栄え,1995年以来の出来').
'ボージョレ・ヌーボーの謳い文句'('03年','100年に1度の出来,近年にない良い出来').
'ボージョレ・ヌーボーの謳い文句'('04年','香りが強く中々の出来栄え').
'ボージョレ・ヌーボーの謳い文句'('05年','ここ数年で最高').
'ボージョレ・ヌーボーの謳い文句'('06年','昨年同様良い出来栄え').
'ボージョレ・ヌーボーの謳い文句'('07年','柔らかく果実味が豊かで上質な味わい').
'ボージョレ・ヌーボーの謳い文句'('08年','豊かな果実味と程よい酸味が調和した味').
'ボージョレ・ヌーボーの謳い文句'('09年','50年に1度の出来栄え').

ここ数年で一番出来が良い(_年産,_謳い文句) :-
        ここ数年で(_年産,_ここ数年),
        一番出来が良い(_年産,_ここ数年,_謳い文句).

一番出来が良い(_年産,_ここ数年,_一番出来が良い) :-
        findall(_出来具合2,(
                    member(_年産2,_ここ数年),
                    'ボージョレ・ヌーボーの謳い文句'(_年産2,_出来具合2)),_ここ数年のボージョレ・ヌーボー出来具合ならび),
        最高の謳い文句(_ここ数年のボージョレ・ヌーボー出来具合ならび,_一番出来が良い).

ここ数年で(_年産,_ここ数年) :-
        年齢によって微妙に違うここ数年を得る(_年産,_数年),
        _起点年 is _年 - _数年,
        findall(_年産2,(
                   between(_起点年,_年,_年_2),
                   ヘッドゼロサプライ(2,_年_2,_年_2_2),
                   atomic_list_concat([_年_2_2,年],_年産2)),_ここ数年).

年齢によって微妙に違うここ数年を得る(_年産,_数年) :-
        年を切り取る(_年産,_年),
        定義者の年齢(_年齢),
        数年は定義者の年齢によって異なる(_年齢,_数年).

年を切り取る(_年産,_年) :-
        sub_atom(_年産,S,1,_,年),
        sub_atom(_年産,0,S,_,_年2),
        read_term_from_atom(_年2,_年,_).

定義者の年齢(60).

数年は定義者の年齢によって異なる(_年齢,3) :- _年齢 < 70.
数年は定義者の年齢によって異なる(_年齢,5) :- _年齢 >= 70.

ヘッドゼロサプライ(_桁数,_整数,_数文字列) :-
        number_chars(_整数,Chars),
        length(Chars,_文字列の桁数),
        ヘッドゼロサプライ(_桁数,Chars,_文字列の桁数,_数文字列).

ヘッドゼロサプライ(_桁数,Chars,_文字列の桁数,_数文字列) :-
        文字列の桁数の不足分だけ0文字ならびを生成(_桁数,_文字列の桁数,_0文字ならび),
        append(_0文字ならび,Chars,_数文字ならび),
        atom_chars(_数文字列,_数文字ならび).

文字列の桁数の不足分だけ0文字ならびを生成(_桁数,_文字列の桁数,_0文字ならび) :-
        _桁の不足 is _桁数 - _文字列の桁数,
        length(_0文字ならび,_桁の不足),
        全て0で埋める(_0文字ならび,'0').

全て0で埋める([],_).
全て0で埋める([A|R],A) :-
        全て0で埋める(R,A).