21世紀における0~3の数字を2個ずつ使ってできる年月日の個数 (「禁則」によって表現するバージョン)

【前回】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',
'0141940',
'034'.
'' :-
% ∀ L [ L : '21' ⇒ L : 229 ]
% ⇔ ∃ L [ L : '21' ∧ L : 229 ]
\+ 21([_,_,_,_, 0,2, 2,9]).
'2' :-
% 31
\+ (
21([_,_,_,_, M1,M2, 3,1]),
M is (M1 * 10 + M2), '2'(M)
).
'2'(M) :- M \== 2, (M).
'0141940' :-
% 02101使
\+ (
21([_,_,_,_, M1,M2, _,_]),
M is (M1 * 10 + M2),
( M == 0 ; (14 =< M, M =< 19) ; M >= 40 ) %
).
'034' :-
\+ (
21([_,_,_,_, _,_, D1,D2]),
D is D1 * 10 + D2,
( D == 0 ; D >= 34 )
).
21(L) :-
([0,0,1,1,2,2,3,3], 8, L), % 032使
[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 )).
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX