このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1248012902/402
# 【 補足 】3問です。本日1日悩みましたが、わかりませんでした。
# いかなる場合でも予期しない例外が出ないこと。
# 1: コマンドライン引数に入力された日付から現在日まで何日かを計算し、「今日まで●日」と表示しなさい。
# 現在日より入力された日付が小さい場合は「-(マイナス)」をつけて表示すること。(日付その他のチェックも行う事)

# 2: コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事)
# 3: コマンドライン引数に入力された日付が、入力された日付の年の何番目の週かを
# 「●年の●週目」と表示しなさい。(●年の"●"は入力された日付の年)(日付その他のチェックも行う事) 
http://pc12.2ch.net/test/read.cgi/tech/1248012902/402
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 1

t815_1 :-
  user_parameters([_年月日]),
    日付整数(今日,_今日の年整数,_今日の月整数,_今日の日整数),
    atom_to_term(_年月日,_年月日整数,_),
    日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数),
    何日前後から調べる(_今日の年整数/_今日の月整数/_今日の日整数,
_年整数/_月整数/_日整数,N日後),
    write_formatted('入力された日付から今日まで%t日です\n',[N日後]).

日付整数を年、月、日に分割(_日付整数,_年整数,_月整数,_日整数) :-
    _年整数 is _日付整数 // 10000,
    Mod1 is _年整数 mod 10000,
    _月整数 is Mod1 // 100,
    _日整数 is Mod1 mod 100.

何日前後から調べる(_日付,_日付,0) :- !.
何日前後から調べる(_日付1,_日付2,N日後) :-
    _日付1 @> _日付2,
    何日前後から調べる(_日付2,_日付1,N日後の一),
    N日後 is (-1) * _N日後の一,!.
何日前後から調べる(_日付1,_日付2,N日後) :-
    _日付1 @=< _日付2,
    前日・今日(_日付1,_日付3),
    何日前後から調べる(_日付3,_日付2,M日後),
    N日後 is M日後 + 1,!.


# 2 コマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事)

t815_2 :-
  user_parameters([_年,_月]),
  月末日は何日(_年,_月,_月末日),
  write_formatted('%t年%月の月末日は%t日です\n',[_年,_月,_月末日]).

月末日は何日(_年,'2','29') :-
  atom_to_term(_年,_年整数,_),
  うるう年(_年整数),!.
月末日は何日(_年,'2','28').
月末日は何日(_年,_月,'30') :-
  member(_月,['4','6','9','11']).
月末日は何日(_年,_月,'31') :-
  member(_月,['1','3','5','7','8','10','12']).

t815_3 :-
  user_parameters([_年月日]),
    atom_to_term(_年月日,_年月日整数,_),
    日付整数を年、月、日に分割(_年月日整数,_年整数,_月整数,_日整数),
    findall(X,(曜日検索(_年整数/1/1,A,X,Y),Y=A,(X @> _年整数/_月整数/_日整数,!,fail;true)),L),
    length(L,N週目),
    write_formatted('この日は1月1日から数えて第%t週目です\n',[N週目]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

日付整数(今日,_年整数,_月整数,_日整数) :-
    A is time,
    localtime(A,_年整数,_月整数,_日整数,_,_,_,_,_).

うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- not(0 is _年 mod 4),fail.

前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :-
    一つ違い(_前日の年,_年),
    曜日連鎖(_前日の曜日,_曜日),!.
前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :-
    うるう年(_年),
    曜日連鎖(_前日の曜日,_曜日),!.
前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :-
    not(うるう年(_年)),
    曜日連鎖(_前日の曜日,_曜日),!.
前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :-
    一つ違い(_前月,_月),
    member(_前月,[4,6,9,11]),
    曜日連鎖(_前日の曜日,_曜日),!.    
前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :-
    一つ違い(_前月,_月),
    member(_前月,[1,3,5,7,8,10,12]),
    曜日連鎖(_前日の曜日,_曜日),!.   
前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :-
    一つ違い(_前日,_日),
    曜日連鎖(_前日の曜日,_曜日),!.    

前日・今日(_前日の年/12/31,_年/1/1) :-
    一つ違い(_前日の年,_年).
前日・今日(_年/2/29,_年/3/1) :-
    うるう年(_年).
前日・今日(_年/2/28,_年/3/1) :-
    not(うるう年(_年)).
前日・今日(_年/_前月/30,_年/_月/1) :-
    一つ違い(_前月,_月),
    member(_前月,[4,6,9,11]).
前日・今日(_年/_前月/31,_年/_月/1) :-
    一つ違い(_前月,_月),
    member(_前月,[1,3,5,7,8,10,12]).
前日・今日(_年/_月/_前日,_年/_月/_日) :-
    一つ違い(_前日,_日).

曜日検索(_日付,_曜日,_今日,_今日の曜日) :-
    var(_日付),
    var(_曜日),
    前日・今日(_日付,_曜日,_今日,_今日の曜日).
曜日検索(_日付,_曜日,_今日,_今日の曜日) :-
    var(_日付),
    var(_曜日),
    前日・今日(_前日,_前日の曜日,_今日,_今日の曜日),
    曜日検索(_日付,_曜日,_前日,_前日の曜日).
曜日検索(_今日,_今日の曜日,_日付,_曜日) :-
    var(_日付),
    var(_曜日),
    前日・今日(_今日,_今日の曜日,_日付,_曜日).
曜日検索(_今日,_今日の曜日,_日付,_曜日) :-
    var(_日付),
    var(_曜日),
    前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日),
    曜日検索(_翌日,_翌日の曜日,_日付,_曜日).

一つ違い(M,N) :-
    integer(M),!,
    N is M + 1.
一つ違い(M,N) :-
    integer(N),!,
    M is N - 1.

曜日連鎖(月曜,火曜).
曜日連鎖(火曜,水曜).
曜日連鎖(水曜,木曜).
曜日連鎖(木曜,金曜).
曜日連鎖(金曜,土曜).
曜日連鎖(土曜,日曜).
曜日連鎖(日曜,月曜).