【前回】http://codetter.com/?p=898
【着想】http://nojiriko.asia/prolog/twitter_by_c_oi_20130213.html
(https://twitter.com/TakaoOzaki/status/301562885103026176)
【前回】と【着想】を混ぜて、いくらか書き加えたもの。
量化命題の自動証明を行う。
【前回】http://codetter.com/?p=898
【着想】http://nojiriko.asia/prolog/twitter_by_c_oi_20130213.html
(https://twitter.com/TakaoOzaki/status/301562885103026176)
【前回】と【着想】を混ぜて、いくらか書き加えたもの。
量化命題の自動証明を行う。
順列(Y,0,[]).順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X).del(A,[A|X],X).del(A,[B|X],[B|Y]) :- del(A,X,Y).小の月(2).小の月(4).小の月(6).小の月(9).小の月(11).% 小の月(M) :- 月の日数(M, Days), Days < 31.'「禁則」の簡略化のために利用する諸命題' :-'閏年か否かは考慮しなくてよい','2月以外の小の月の存在は考慮しなくてよい','0月、14~19月および40月以上の年月日ならびは発生しない','0日および34日以上の年月日ならびは発生しない'.'閏年か否かは考慮しなくてよい' :-% ∀ L [ L : '順列と21世紀の条件'を満たす ⇒ L : 2月29日を表す年月日並びではない ]% ⇔ ¬∃ L [ L : '順列と21世紀の条件'を満たす ∧ L : 2月29日を表す年月日並びである ]\+ 順列と21世紀の条件([_,_,_,_, 0,2, 2,9]).'2月以外の小の月の存在は考慮しなくてよい' :-% 小の月:31日の存在しない月\+ (順列と21世紀の条件([_,_,_,_, M1,M2, 3,1]),M is (M1 * 10 + M2), '2月以外の小の月'(M)).'2月以外の小の月'(M) :- M \== 2, 小の月(M).'0月、14~19月および40月以上の年月日ならびは発生しない' :-% 0月が発生しないのは、21世紀だから、年が0を少なくとも1つ使うため\+ (順列と21世紀の条件([_,_,_,_, M1,M2, _,_]),M is (M1 * 10 + M2),( M == 0 ; (14 =< M, M =< 19) ; M >= 40 ) % まとめた).'0日および34日以上の年月日ならびは発生しない' :-\+ (順列と21世紀の条件([_,_,_,_, _,_, D1,D2]),D is D1 * 10 + D2,( D == 0 ; D >= 34 )).順列と21世紀の条件(L) :-順列([0,0,1,1,2,2,3,3], 8, L), % 「0~3の数字を2個ずつ使ってできる」こと[2,0,0,1, 0,1, 0,1] @=< L, % 「21世紀」であることL @=< [2,1,0,0, 1,2, 3,1].禁則([_,_,_,_, 0,2, 3,_]) :- !.禁則([_,_,_,_, 1,3, _,_]) :- !.禁則([_,_,_,_, 2,_, _,_]) :- !.禁則([_,_,_,_, 3,_, _,_]) :- !.禁則([_,_,_,_, _,_, 3,2]) :- !.禁則([_,_,_,_, _,_, 3,3]) :- !.条件(L) :-% L = [Y1,Y2,Y3,Y4, M1,M2, D1,D2],順列と21世紀の条件(L),\+ 禁則(L). % 「年月日ならび」であるための条件 ('順列と21世紀の条件'と併せて)?- '「禁則」の簡略化のために利用する諸命題',setof(L, 条件(L), Ls), length(Ls, N).% N = 48/*備考:全称命題の証明は面倒くさいので、二重否定を使って“存在の否定”命題に変形した。'∀x p(x)' :- setof(x, p(x), (x の全体集合を表す整列されたリスト)).% :- setof(x, x ∈ 全体集合, (x の全体集合を表す整列されたリスト)).*/