このディレクトリの索引

# # 犬の誕生日が記録してあるデータが入ったテーブルがあります。 # 兄弟犬を抽出したいという要望です。 # # 兄弟の定義は「母が同一かつ同時に出産した個体(同胎)」だとします。 # 母親は各データが持っていますが、同時出産でも誕生日が日付をまたぐことがあります。 # 2日にまたがる難産の場合もあると思われます。 # ただし、出産は数ヶ月に一度です。 # 母犬(ピノ,リリー). 母犬(キオ,リリー). 母犬(グリ,リリー). 誕生日(ピノ,2003/7/31). 誕生日(キオ,2003/8/1). 誕生日(グリ,2007/4/15). 兄弟犬を抽出したい(_犬,_兄弟犬) :- 母犬が共通(_犬,_兄弟犬), 誕生日が2日以内(_犬,_兄弟犬), 自分自身は除く(_犬,_兄弟犬). 自分自身は除く(_犬_1,_犬_2) :- _犬_1 \== _犬_2. 母犬が共通(_犬,_兄弟犬) :- 母犬(_犬,_母犬), 母犬(_兄弟犬,_母犬). 誕生日が2日以内(_犬,_兄弟犬) :- 誕生日が(_犬,_兄弟犬,_犬の誕生日,_兄弟犬の誕生日), '2日以内'(_犬の誕生日,_兄弟犬の誕生日). 誕生日が(_犬,_兄弟犬,_犬の誕生日,_兄弟犬の誕生日) :- 誕生日(_犬,_犬の誕生日), 誕生日(_兄弟犬,_兄弟犬の誕生日). '2日以内'(_犬の誕生日,_兄弟犬の誕生日) :- 連続日(_犬の誕生日の前日,_犬の誕生日), 連続日(_犬の誕生日,_犬の誕生日の翌日), member(_兄弟犬の誕生日,[_犬の誕生日,_犬の誕生日の前日,_犬の誕生日の翌日]). 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月), '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月). '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_うるう年) :- うるう年とは4で割り切れる年から例外となる年を除いたものである(_うるう年). うるう年とは4で割り切れる年から例外となる年を除いたものである(_うるう年) :- うるう年とは4で割り切れる年から(_うるう年), 例外となる年を除いたものである(_うるう年). うるう年とは4で割り切れる年から(_うるう年) :- 0 is _うるう年 mod 4. 例外となる年を除いたものである(_うるう年) :- \+(例外となる年(_うるう年)). 例外となる年(_例外となる年) :- 0 is _例外となる年 mod 100, \+(0 is _例外となる年 mod 400).