このディレクトリの索引

% 以下のサイトは 最長反復文字列(_文字列,_最長反復文字列) :- setof([Len,_最長反復文字列], [Len,_最長反復文字列] ^ ( 最長反復文字列(_文字列,Len,_最長反復文字列)),LL), 最長反復文字列を取り出す(LL,_最長反復文字列). 最長反復文字列(_文字列,Len,_最長反復文字列) :- sub_atom(_文字列,_前文字列,_最長反復文字列,_後文字列), atom_length(_最長反復文字列,Len), sub_atom(_後文字列,0,Len,_,_最長反復文字列). 最長反復文字列を取り出す(LL,_最長反復文字列) :- findmax(N,member([N,_],LL),_最長文字数), member([_最長文字数,_最長反復文字列],LL). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは '父方先祖、母方先祖の集合を作り、クロスがある共通先祖の血量合計が最大である先祖を得る。'(_本人,_血量が最大である先祖) :- '父方と母方のふたつの集合を作り、'(_本人,_父方集合,_母方集合,_共通先祖ならび), 'クロスがある共通先祖の血量合計が最大である先祖を得る。'(_父方集合,_母方集合,_共通先祖ならび,_血量が最大である先祖). '父方と母方のふたつの集合を作り、'(_本人,_父方集合,_母方集合,_共通先祖ならび) :- 父方集合を得る(_本人,_父方集合), 母方集合を得る(_本人,_母方集合), 父方集合と母方集合を先祖で集約して共通先祖ならびを得る(_父方集合,_母方集合,_共通先祖ならび). 父方集合を得る(_本人,_父方_世代_先祖集合) :- 父(_本人,_父), findall([_世代,_先祖],世代を数えながら先祖を得る(_父,0,_世代,_先祖),_父方_世代_先祖集合). 母方集合を得る(_本人,_母方_世代_先祖集合) :- 母(_本人,_母), findall([_世代,_先祖],世代を数えながら先祖を得る(_母,0,_世代,_先祖),_母方_世代_先祖集合). 世代を数えながら先祖を得る(_子,_世代_1,_世代,_先祖) :- 父または母(_子,_父または母), succ(_世代_1,_世代_2), 先祖を得る(_父または母,_世代_2,_世代,_先祖). 父または母(_子,_父または母) :- 父(_子,_父). 父または母(_子,_父または母) :- 母(_子,_母). 先祖を得る(_父または母,_世代,_世代,_父または母). 先祖を得る(_父または母,_世代_2,_世代,_先祖) :- 世代を数えながら先祖を得る(_父または母,_世代_2,_世代,_先祖). 父方集合と母方集合を先祖で集約して共通先祖ならびを得る(_父方集合,_母方集合,_共通先祖ならび) :- 父方集合を先祖で集約(_父方集合,_父方先祖ならび), 母方集合を先祖で集約(_母方集合,_母方先祖ならび), intersection(_父方先祖ならび,_母方先祖ならび,_共通先祖ならび). 父方集合を先祖で集約(_父方集合,_父方先祖ならび) :- setof(_先祖,[_世代,_先祖] ^ member([_世代,_先祖],_父方集合),_父方先祖ならび). 母方集合を先祖で集約(_母方集合,_母方先祖ならび) :- setof(_先祖,[_世代,_先祖] ^ member([_世代,_先祖],_母方集合),_母方先祖ならび). 'クロスがある共通先祖の血量合計が最大である先祖を得る。'(_父方集合,_母方集合,_共通先祖ならび,_血量が最大である先祖) :- 先祖_血量ならびを得る(_共通先祖ならび,_父方集合,_母方集合,_先祖_血量ならび), 血量が最大である先祖を取り出す(_先祖_血量ならび,_血量が最大である先祖). 先祖_血量ならびを得る(_共通先祖ならび,_父方集合,_母方集合,_先祖_血量ならび) :- append(_父親集合,_母親集合,_親集合), findall([_先祖,_血量],共通先祖ならびから先祖の血量を得る(_共通先祖ならび,_親集合,_先祖,_血量),_先祖_血量ならび). 共通先祖ならびから先祖の血量を得る(_共通先祖ならび,_親集合,_先祖,_血量) :- member(_先祖,_共通先祖ならび), 血量を得る(_先祖,_親集合,_血量). 血量を得る(_先祖,_親集合,_血量) :- findsum(_血量,( 先祖が現れるごとにその部分血量を計算する(_先祖,_親集合,_血量)),_血量合計). 先祖が現れるごとにその部分血量を計算する(_先祖,_親集合,_血量) :- member([_世代,_先祖],_親集合), 血量計算(_世代,_血量). 血量計算(_世代,_血量) :- _血量 is 1 rdiv (2 ^ _世代). 血量が最大である先祖を取り出す(_先祖_血量ならび,_血量が最大である先祖) :- findmax(_血量,member([_,_血量],_先祖_血量ならび),_最大血量), member([_血量が最大である先祖,_最大血量],_先祖_血量ならび). findmax(A,P,Max) :- findall(A,P,L), max_list(L,Max). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは 'クロスがある先祖の最大血量'(_本人,_世代限界値,_血量の最大の先祖) :- 'n代まで遡りそこに全ての現れる父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。要素の中の、血量の最大のものを得る。'(_本人,_世代限界値,_血量の最大の先祖). 'n代まで遡りそこに全ての現れる父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。要素の中の、血量の最大のものを得る。'(_本人,_世代限界値,_血量の最大の先祖) :- findall([_先祖,_血量],( 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_先祖,_血量)),_先祖_血量ならび), 血量最大の先祖を得る(_先祖_血量ならび,_血量最大の先祖). 血量最大の先祖を得る(_先祖_血量ならび,_血量の最大の先祖) :- 最大血量値を得る(_先祖_血量ならび,_最大血量値), member([_血量の最大の先祖,_最大血量値],_先祖_血量ならび). 最大血量値を得る(_先祖_血量ならび,_最大血量値) :- findmax(_血量,member([_,_血量],_先祖_血量ならび),_最大血量値). 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_先祖,_先祖血量) :- 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。'(_本人,_世代限界値,_父方集合,_母方集合), 'その積集合を取り、'(_父方集合,_母方集合,_積集合), 'その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_積集合,_先祖,_先祖血量). 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。'(_本人,_世代限界値,_父方集合,_母方集合) :- 父方集合を得る(_本人,_世代限界値,_父方集合), 母方集合を得る(_本人,_世代限界値,_母方集合). 父方集合を得る(_本人,_世代限界値,_父方集合) :- 父(_本人,_父), findall(_先祖,世代を数えながら先祖を得る(_父,_世代限界値,_世代_1,_世代,_先祖),_父方集合). 母方集合を得る(_本人,_世代限界値,_母方集合) :- 母(_本人,_母), findall(_先祖,世代を数えながら先祖を得る(_母,_世代限界値,_世代_1,_世代,_先祖),_母方集合). 'その積集合を取り、'(_父方集合,_母方集合,_積集合) :- intersection(_父方集合,_母方集合,_積集合). 世代を数えながら先祖を得る(_本人,_世代限界値,_世代_1,_世代,_先祖) :- _世代限界値 > _世代_1, 父または母(_本人,_父または母), succ(_世代_1,_世代_2), 先祖を得る(_父または母,_世代限界値,_世代_2,_世代,_先祖). 父または母(_本人,_父または母) :- 父(_本人,_父). 父または母(_本人,_父または母) :- 母(_本人,_母). 先祖を得る(_父または母,_,_世代,_世代,_父または母). 先祖を得る(_父または母,_世代限界値,_世代_1,_世代,_先祖) :- 世代を数えながら先祖を得る(_父または母,_世代限界値,_世代_1,_世代,_先祖). 'その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_積集合,_先祖,_先祖血量) :- member(_先祖,_積集合), findall([_世代,_先祖],世代を数えながら先祖を得る(_本人,_世代限界値,0,_世代,_先祖),_世代_先祖ならび), 血量計算(_世代先祖ならび,[],_先祖血量). 血量計算([],L,_先祖血量) :- sum_list(L,_先祖血量). 血量計算([[_世代,_]|R1],L,_先祖血量) :- _血量 is 1 rdiv (2 ^ _世代), 血量計算(R1,[_血量|L],_先祖血量). findmax(A,P,Max) :- findall(A,P,L), max_list(L,Max). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 - 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]-R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび). 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび) :- findall(_価格,( 時刻tに於ける価格(_時系列数,_価格)),_時刻tに於ける価格ならび). 時刻tに於ける価格(_時系列数,_価格) :- between(1,_時系列数,_t), 価格を得る(_価格). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差)),_最大の為替差の利益). 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差) :- append(_,[_時刻tの価格|_その後の価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)),_時刻tの投資に対する最大価格差). 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 時系列数を得る(_時系列数) :- 数を得る(_時系列数). 価格を得る(_価格) :- 数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). 数を得る(_数) :- 行入力(_行), 数入力検査(_行,_数). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 数入力検査(_行,_数) :- read_term_from_atom(_行,_数,[]), number(_数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_詰め方,_詰めることのできる最大重量) :- 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL), 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量), 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方). 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL) :- findall([_詰め方,_選択位置ならび],詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ),LL). 詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ) :- 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,詰めた重さ) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_詰めた重さ), _詰めた重さ =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量) :- findmax(_詰めた重さ,member([_,_詰めた重さ],LL),_詰めることのできる最大重量). 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方) :- member([_選択位置ならび,_詰めることのできる最大重量],LL), findall(_重さ,( member(_位置,_選択位置ならび), nth1(_位置,_重さならび,_重さ)),_詰め方). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_価格ならび,_詰めることのできる最高合計金額) :- findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_選択位置ならび,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび), 集合の合計価格(_選択位置ならび,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび) :- member(_選択位置ならび,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: # すいませんおねがいします。日曜までです。 # # # String型の配列として与えられた人の名前を全て使って「しりとり」を作りましょう。 # 参考資料ファイルを自分のプロジェクトにコピーもしくはインポートし、50音順で並んでいる配列をしりとりの原理で並び替え、出力するプログラムを作成してください。 # -----------Original NameList----------- # ごりら # らっぱ # りんご # -----------Sorted NameList----------- # りんご # ごりら # らっぱ # # 単語は適当に自分がうめるのでプログラミングそのものだけつくってもらえませんか? # # # 語彙集(ごりら). 語彙集(らっぱ). 語彙集(りんご). 語彙集(もも). 語彙集(もり). 語彙集(こくご). 語彙集(らっこ). しりとり(_任意の語彙,_最長のしりとり) :- findall(_しりとり,しりとり([_任意の語彙],_任意の語彙,_しりとり),_しりとりならび), 最長のしりとりを得る(_しりとりならび,_最長のしりとり). しりとり(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり). しりとり(_逆順しりとり,_語彙,_しりとり) :- 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり). 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙), しりとり([_次の語彙|_すでに使った語彙ならび],_次の語彙,_しりとり). 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙) :- '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙), 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび). '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙) :- sub_atom(_語彙,_,1,0,_語彙の最後の文字), 語彙集(_次の語彙), sub_atom(_次の語彙,0,1,_,_語彙の最後の文字). 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび) :- \+(member(_次の語彙,_すでに使った語彙ならび)). 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり) :- reverse(_逆順しりとり,_しりとり). 最長のしりとりを得る(_しりとりならび,_最長のしりとり) :- しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数), 最大要素数のしりとりを得る(_しりとりならび,_最大要素数,_最長のしりとり). しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数) :- findmax(_要素数,しりとりの要素数(_しりとりならび,_要素数),_最大要素数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). しりとりの要素数(LL,_要素数) :- member(_しりとり,LL), length(_しりとり,_要素数). 最大要素数のしりとりを得る(LL,_最大要素数,_最長のしりとり) :- member(_最長のしりとり,LL), length(_最長のしりとり,_最大要素数). % 以下のサイトは 最長しりとりならび(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび). 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得て(_語彙ならび,_全しりとりならび), その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび). 全しりとりならびを得て(_語彙ならび,_全しりとりならび) :- findall(_しりとりならび,( select(_語彙,_語彙ならび,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,_しりとりならび)),_全しりとりならび). その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび) :- 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数), 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび). 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数) :- findmax(_要素数,( member(_しりとりならび,_全しりとりならび), length(_しりとりならび,_要素数)),_最長しりとり要素数). 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび) :- member(_最長しりとりならび,_全しりとりならび), length(_最長しりとりならび,_最長しりとり要素数). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[_前の語彙]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- sub_atom(_前の語彙,_,1,0,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(sub_atom(_語彙,0,1,_,_語彙の先頭文字))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_前の語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), sub_atom(_語彙,0,1,_,_語彙の先頭文字). findmax(A,B,Max) :- findall(A,B,L), max_list(L,Max). % 以下のサイトは 検索した用語の医療用語である確信度(_文字列,_検索した用語,_変位,_文字数,_医療用語,_医療用語文字数,_確信度) :- 最も長い医療用語(_最も長い医療用語文字数), 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語), 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度). 最も長い医療用語文字数(_最も長い医療用語文字数) :- findmax(_文字数,( 医療用語集(_医療用語), sub_atom(_医療用語,0,_文字数,0,_医療用語)),_最も長い医療用語文字数). 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語) :- sub_atom(_文字列,_変位,_文字数,_,_検索した用語), between(1,_最も長い医療用語文字数,_文字数). 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数) :- 医療用語集(_医療用語), sub_atom(_医療用語,0,_医療用語の文字数,0,_医療用語), sub_atom(_医療用語,_,_文字数,_,_検索した用語). 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度) :- 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数), _確信度 is _文字数 / _医療用語の文字数. % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( between(1,_時系列数,_t), 価格を得る(_価格)), _時刻tに於ける価格ならび). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( append(_,[_時刻tの価格|_その後価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差)), _最大の為替差の利益). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格), _時刻tの投資に対する最大価格差). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_価格) :- 整数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # まだ読まれていない、読み札も分かっていることとします。 # 読み札/2、既に読んでしまった札/2、自陣/1、敵陣/1がそれぞれ # 述語としして定義済みだとして、自陣、敵陣、あるいはその両方の札の # 決まり字を示すプログラムを定義してください。 # :- dynamic(読み札/1). :- dynamic(既に読んでしまった札/1). :- dynamic(自陣/1). :- dynamic(敵陣/1). 自陣または敵陣の全ての札の決まり字(_下の句,_上の句,_決まり字) :- 自陣または敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 自陣の札の決まり字(_下の句,_上の句,_決まり字) :- 自陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 敵陣の札の決まり字(_下の句,_上の句,_決まり字) :- 敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 決まり字(_上の句,_決まり字) :- 最長共通文字数(_上の句,_最長共通文字数), succ(_最長共通文字数,_決まり字の位置), sub_atom(_上の句,0,_決まり時の位置,_,_決まり字). 最長共通文字数(_上の句,_最長共通文字数) :- findmax(_先頭から最長共通文字数,( 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句), '先頭から最長共通文字数(0オリジン)'(_上の句,別の上の句,_先頭からの最長共通文字数)),_最長共通文字数). 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句) :- 読み札(_別の上の句,_), \+(_上の句 = _別の上の句). '先頭から最長共通文字数(0オリジン)'(_上の句,_別の上の句,_文字数) :- nth0(_文字数,_,_), sub_atom(_上の句,_文字数,1,_,_文字_1), sub_atom(_別の上の句,_文字数,1,_,_文字_2), \+(_文字_1=_文字_2),!. 下の句から決まり字を得る(_下の句,_決まり字) :- 自陣または敵陣(_下の句), '下の句から上の句を得る'(_下の句,_上の句), 決まり字(_上の句,_決まり字). 自陣または敵陣(_下の句) :- 自陣(_下の句). 自陣または敵陣(_下の句) :- 敵陣(_下の句). 下の句から上の句を得る(_下の句,_上の句) :- 読み札(_上の句,_下の句). findmax(_値,_目標,_最大値) :- findall(_値,_目標,_値ならび), 最大値(_値ならび,_最大値). 最大値(_標本ならび,_最大値) :- select(_最大値,_標本ならび,_残り標本ならび), forall(member(_標本_1,_残り標本ならび),_標本_1 @=< _最大値),!. /* 読み札('あきのたのかりほのいほのとまをあらみ,わがころもではつゆにぬれつつ'). 読み札('はるすぎてなつきにけらししろたへの,ころもほすてふあまのかぐやま'). 読み札('あしびきのやまどりのをのしだりをの,ながながしよをひとりかもねむ'). 読み札('たごのうらにうちいでてみればしろたへの,ふじのたかねにゆきはふりつつ'). 読み札('おくやまにもみぢふみわけなくしかの,こゑきくときぞあきはかなしき'). 読み札('かささぎのわたせるはしにおくしもの,しろきをみればよぞふけにける'). 読み札('あまのはらふりさけみればかすがなる,みかさのやまにいでしつきかも'). 読み札('わがいほはみやこのたつみしかぞすむ,よをうぢやまとひとはいふなり'). 読み札('はなのいろはうつりにけりないたづらに,わがみよにふるながめせしまに'). 読み札('これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき'). 読み札('わたのはらやそしまかけてこぎいでぬと,ひとにはつげよあまのつりぶね'). 読み札('あまつかぜくものかよひぢふきとぢよ,をとめのすがたしばしとどめむ'). 読み札('つくばねのみねよりおつるみなのがは,こひぞつもりてふちとなりぬる'). 読み札('みちのくのしのぶもぢずりたれゆゑに,みだれそめにしわれならなくに'). 読み札('きみがためはるののにいでてわかなつむ,わがころもでにゆきはふりつつ'). 読み札('たちわかれいなばのやまのみねにおふる,まつとしきかばいまかへりこむ'). 読み札('ちはやぶるかみよもきかずたつたがは,からくれなゐにみづくくるとは'). 読み札('すみのえのきしによるなみよるさへや,ゆめのかよひぢひとめよくらむ'). 読み札('なにはがたみじかきあしのふしのまも,あはでこのよをすぐしてよとや'). 読み札('わびぬればいまはたおなじなにはなる,みをつくしてもあはむとぞおもふ'). 読み札('いまこむといひしばかりにながつきの,ありあけのつきをまちいでつるかな'). 読み札('ふくからにあきのくさきのしをるれば,むべやまかぜをあらしといふらむ'). 読み札('つきみればちぢにものこそかなしけれ,わがみひとつのあきにはあらねど'). 読み札('このたびはぬさもとりあへずたむけやま,もみぢのにしきかみのまにまに'). 読み札('なにしおはばあふさかやまのさねかづら,ひとにしられでくるよしもがな'). 読み札('をぐらやまみねのもみぢばこころあらば,いまひとたびのみゆきまたなむ'). 読み札('みかのはらわきてながるるいづみがは,つみきとてかこひしかるらむ'). 読み札('やまざとはふゆぞさびしさまさりける,ひとめもくさもかれぬとおもへば'). 読み札('こころあてにをらばやをらむはつしもの,おきまどはせるしらぎくのはな'). 読み札('ありあけのつれなくみえしわかれより,あかつきばかりうきものはなし'). 読み札('あさぼらけありあけのつきとみるまでに,よしののさとにふれるしらゆき'). 読み札('やまがはにかぜのかけたるしがらみは,ながれもあへぬもみぢなりけり'). 読み札('ひさかたのひかりのどけきはるのひに,しづごころなくはなのちるらむ'). 読み札('たれをかもしるひとにせむたかさごの,まつもむかしのともならなくに'). 読み札('ひとはいさこころもしらずふるさとは,はなぞむかしのかににほひける'). 読み札('なつのよはまだよひながらあけぬるを,くものいづこにつきやどるらむ'). 読み札('しらつゆにかぜのふきしくあきののは,つらぬきとめぬたまぞちりける'). 読み札('わすらるるみをばおもはずちかひてし,ひとのいのちのをしくもあるかな'). 読み札('あさぢふのをののしのはらしのぶれど,あまりてなどかひとのこひしき'). 読み札('しのぶれどいろにいでにけりわがこひは,ものやおもふとひとのとふまで'). 読み札('こひすてふわがなはまだきたちにけり,ひとしれずこそおもひそめしか'). 読み札('ちぎりきなかたみにそでをしぼりつつ,すゑのまつやまなみこさじとは'). 読み札('あひみてののちのこころにくらぶれば,むかしはものをおもはざりけり'). 読み札('あふことのたえてしなくはなかなかに,ひとをもみをもうらみざらまし'). 読み札('あはれともいふべき人はおもほえで,みのいたづらになりぬべきかな'). 読み札('ゆらのとをわたるふなびとかぢをたえ,ゆくへもしらぬこひのみちかな'). 読み札('やへむぐらしげれるやどのさびしきに,ひとこそみえねあきはきにけり'). 読み札('かぜをいたみいはうつなみのおのれのみ,くだけてものをおもふころかな'). 読み札('みかきもりゑじのたくひのよるはもえ,ひるはきえつつものをこそおもへ'). 読み札('きみがためをしからざりしいのちさへ,ながくもがなとおもひけるかな'). 読み札('かくとだにえやはいぶきのさしもぐさ,さしもしらじなもゆるおもひを'). 読み札('あけぬればくるるものとはしりながら,なほうらめしきあさぼらけかな'). 読み札('なげきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる'). 読み札('わすれじのゆくすゑまではかたければ,けふをかぎりのいのちともがな'). 読み札('たきのおとはたえてひさしくなりぬれど,なこそながれてなほきこえけれ'). 読み札('あらざらむこのよのほかのおもひでに,いまひとたびのあふこともがな'). 読み札('めぐりあひてみしやそれともわかぬまに,くもがくれにしよはのつきかな'). 読み札('ありまやまゐなのささはらかぜふけば,いでそよひとをわすれやはする'). 読み札('やすらはでねなましものをさよふけて,かたぶくまでのつきをみしかな'). 読み札('おほえやまいくののみちのとほければ,まだふみもみずあまのはしだて'). 読み札('いにしへのならのみやこのやへざくら,けふここのへににほひぬるかな'). 読み札('よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさじ'). 読み札('いまはただおもひたえなむとばかりを,ひとづてならでいふよしもがな'). 読み札('あさぼらけうぢのかはぎりたえだえに,あらはれわたるせぜのあじろぎ'). 読み札('うらみわびほさぬそでだにあるものを,こひにくちなむなこそをしけれ'). 読み札('もろともにあはれとおもへやまざくら,はなよりほかにしるひともなし'). 読み札('はるのよのゆめばかりなるたまくらに,かひなくたたむなこそをしけれ'). 読み札('こころにもあらでうきよにながらへば,こひしかるべきよはのつきかな'). 読み札('あらしふくみむろのやまのもみぢばは,たつたのかはのにしきなりけり'). 読み札('さびしさにやどをたちいでてながむれば,いづこもおなじあきのゆふぐれ'). 読み札('ゆふさればかどたのいなばおとづれて,あしのまろやにあきかぜぞふく'). 読み札('おとにきくたかしのはまのあだなみは,かけじやそでのぬれもこそすれ'). 読み札('たかさごのをのへのさくらさきにけり,とやまのかすみたたずもあらなむ'). 読み札('うかりけるひとをはつせのやまおろしよ,はげしかれとはいのらぬものを'). 読み札('ちぎりおきしさせもがつゆをいのちにて,あはれことしのあきもいぬめり'). 読み札('わたのはらこぎいでてみればひさかたの,くもゐにまがふおきつしらなみ'). 読み札('せをはやみいはにせかるるたきがはの,われてもすゑにあはむとぞおもふ'). 読み札('あはぢしまかよふちどりのなくこゑに,いくよねざめぬすまのせきもり'). 読み札('あきかぜにたなびくくものたえまより,もれいづるつきのかげのさやけさ'). 読み札('ながからむこころもしらずくろかみの,みだれてけさはものをこそおもへ'). 読み札('ほととぎすなきつるかたをながむれば,ただありあけのつきぞのこれる'). 読み札('おもひわびさてもいのちはあるものを,うきにたへぬはなみだなりけり'). 読み札('よのなかよみちこそなけれおもひいる,やまのおくにもしかぞなくなる'). 読み札('ながらへばまたこのごろやしのばれむ,うしとみしよぞいまはこひしき'). 読み札('よもすがらものおもふころはあけやらで,ねやのひまさへつれなかりけり'). 読み札('なげけとてつきやはものをおもはする,かこちがほなるわがなみだかな'). 読み札('むらさめのつゆもまだひぬまきのはに,きりたちのぼるあきのゆふぐれ'). 読み札('なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるべき'). 読み札('たまのをよたえなばたえねながらへば,しのぶることのよわりもぞする'). 読み札('みせばやなをじまのあまのそでだにも,ぬれにぞぬれしいろはかはらず'). 読み札('きりぎりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ'). 読み札('わがそではしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし'). 読み札('よのなかはつねにもがもななぎさこぐ,あまのをぶねのつなでかなしも'). 読み札('みよしののやまのあきかぜさよふけて,ふるさとさむくころもうつなり'). 読み札('おほけなくうきよのたみにおほふかな,わがたつそまにすみぞめのそで'). 読み札('はなさそふあらしのにはのゆきならで,ふりゆくものはわがみなりけり'). 読み札('こぬひとをまつほのうらのゆふなぎに,やくやもしほのみもこがれつつ'). 読み札('かぜそよぐならのをがはのゆふぐれは,みそぎぞなつのしるしなりける'). 読み札('ひともをしひともうらめしあぢきなく,よをおもふゆゑにものおもふみは'). 読み札('ももしきやふるきのきばのしのぶにも,なほあまりあるむかしなりけり'). */ % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/740 # [1] 授業単元: プログラミング基礎 # [2] 問題文、ブラックジャックの判定処理を行う # 1人目の数字列を入力(1個〜10個まで) # 2人目の数字列を入力(1個〜10個まで) # 数字は、1から13。 # 合計が21を超えたら点数は、0点。 # 1は、1点または、11点として使える。 # 11以上は10点として数える。 # それ以外は、数字がそのまま点数。 # 勝った方を番号で表示(1 or 2) # 引き分けは、2の勝ちとする # 実行例) # 1 5 8 入力1(14) # 5 7 4 入力2(16) # 2 出力 # 13 1 入力1(21) # 12 10 入力2(20) # 1 出力 # 13 8 入力1(18) # 1 9 入力2(20) # 2 出力 # 1 1 8 入力1(20) # 3 4 7 入力2(14) # 1 出力 # 10 8 7 入力1(25) # 3 5 8 入力2(16) # 2 出力 # 'ブラックジャックの判定処理を行う 合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。 勝った方を番号で表示(1 or 2) 引き分けは、2の勝ちとする' :- ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび), '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2), ブラックジャックの判定(_点数_1,_点数_2,_勝者), 勝った方を番号で表示(_勝者). ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび) :- カードの準備(_配り札_1), ブラックジャックの札を配る(_配り札_1,[],_1人目の数字ならび,_配り札_2), ブラックジャックの札を配る(_配り札_2,[],_2人目の数字ならび,_),!. カードの準備(_配り札) :- findall(N,( between(1,13,N), between(1,4,_)), _配り札). ブラックジャックの札を配る(_配り札,_数字ならび,_数字ならび,_配り札) :- 合計点の最高(_数字ならび,_合計点の最高), between(14,21,_合計点の最高),!. ブラックジャックの札を配る(_配り札_1,_現在までの数字ならび,_数字ならび,_残り配り札) :- 一枚配る(_配り札_1,_数字,_配り札_2), ブラックジャックの札を配る(_配り札_2,[_数字|_現在までの数字ならび],_数字ならび,_残り配り札). 一枚配る(_配り札_1,_数字,_配り札_2) :- length(_配り札_1,_配り札の枚数), _抜き位置 is random(_配り札の枚数), length(L1,_抜き位置), append(L1,[_数字|L2],_配り札_1), append(L1,L2,_配り札_2). '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2) :- 合計点の最高(_1人目の数字ならび,_点数_1), 合計点の最高(_2人目の数字ならび,_点数_2). 合計点の最高(_数字ならび,_合計点の最高) :- findall(_合計点,( 合計点(_数字ならび,_合計点)), _合計点ならび), findmax(_合計点,( member(_合計点,_合計点ならび), _合計点 =< 21), _合計点の最高),!. 合計点の最高(_,0). 合計点([],0). 合計点([N|R],S) :- 合計点(R,S_2), 点数の数え方(N,N_2), S is N_2 + S_2. 点数の数え方(1,1). 点数の数え方(1,11). 点数の数え方(11,10). 点数の数え方(12,10). 点数の数え方(13,10). 点数の数え方(N,N) :- between(2,10,N). ブラックジャックの判定(_点数_1,_点数_2,2) :- _点数_2 >= _点数_1,!. ブラックジャックの判定(_,_,1). 勝った方を番号で表示(_勝者) :- writef('勝ったのは %t です\n',[_勝者]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #224 # # お題:自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。10000以下でこの操作の繰り返し回数が最大となる自然数nを求める。 # '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。10000以下でこの操作の繰り返し回数が最大となる自然数nを求める。'(_自然数n) :- findall([_繰り返し回数,_自然数n],( between(1,10000,_自然数n), '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_自然数n,_繰り返し回数)), _繰り返し数_自然数nならび), 繰り返し数が最大の自然数nを得る(_繰り返し数_自然数nならび,_自然数n). '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,_繰り返し回数) :- '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,0,_繰り返し回数). '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(3,_繰り返し回数,_繰り返し回数) :- !. '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,_繰り返し回数_1,_繰り返し回数) :- '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2), succ(_繰り返し回数_1,_繰り返し回数_2), '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n_2,_繰り返し回数_2,_繰り返し回数). '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2) :- 偶数(_n), _n_2 is _n // 2,!. '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2) :- 奇数(_n), _n_2 is (_n + 1) * 3. 繰り返し数が最大の自然数nを得る(_繰り返し数_自然数nならび,_自然数n) :- findmax(_繰り返し回数,( member([_繰り返し回数,_],_繰り返し数_自然数nならび)), _最大繰り返し回数), member([_最大繰り返し回数,_自然数n],_繰り返し数_自然数nならび). 偶数(_n) :- 0 is _n mod 2. 奇数(_n) :- 1 is _n mod 2. findmax(A,P,Max) :- findall(A,P,L), 最大値(L,Max). 最大値(L,_最大値) :- L = [A|R], 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_これまでの最大値,_最大値) :- _これまでの最大値 @>= A, 最大値(R,_これまでの最大値,_最大値),!. 最大値([A|R],_,_最大値) :- 最大値(R,A,_最大値). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 回文数 # コマ大数学科の問題だそうですよ。 # 引用 # ある数字とその数字を逆さに並べた数字を足して # 回文数になるまでこの操作を繰り返すとき # 1番回文数になりにくい2桁の数字を答えなさい。 # # *回文数:逆から読んでも同じ数になる数 # 例えば…96なら # 【1回目】96+69=165 # 【2回目】165+561=726 # 【3回目】726+627=1353 # 【4回目】1353+3531=4884 # となります。 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき 1番回文数になりにくい2桁の数字を答えなさい。'(_2桁の数字,_回文数になるまでの最大回数,_回文数) :- 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき'(_ある数字と回文数になるまでの回数と回文数のならび), '1番回文数になりにくい'(_ある数字と回文数になるまでの回数と回文数のならび,_2桁の数字,_回文数になるまでの最大回数,_回文数). 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき'(_ある数字と回文数になるまでの回数と回文数のならび) :- findall([_ある数字,_回文数になるまでの回数,_回文数],( 2桁の数字(_ある数字), 'ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す'(_ある数字,[],_回文数になるまでの回数,_回文数)), _ある数字と回文数になるまでの回数と回文数のならび). ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_回文数,Ln,_回文数になるまでの回数,_回文数) :- 回文数(_回文数), length(Ln,_回文数になるまでの回数),!. ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_数字_1,L,_回文数になるまでの回数,_回文数) :- ある数字とその数字を逆さに並べた数字を足して(_数字_1,_数字_3), ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_数字_3,[_|L],_回文数になるまでの回数,_回文数). 回文数(_数字) :- number_chars(_数字,L), reverse(L,L). ある数字とその数字を逆さに並べた数字を足して(_数字_1,_数字_3) :- number_chars(_数字_1,L2), reverse(L1,L2), number_chars(_数字_2,L2), 数字_3 is _数字_1 + _数字_2. '1番回文数になりにくい'(_ある数字と回文数になるまでの回数のならび,_ある数,_回文数になるまでの最大回数,_回文数) :- findmax(_回文数になるまでの回数,( member([_,_回文数になるまでの回数,_],_ある数字と回文数になるまでの回数のならび)), _回文数になるまでの最大回数), member([_ある数字,_回文数になるまでの最大回数,_回文数],_ある数字と回文数になるまでの回数のならび). '2桁の数字'(_2桁の数字) :- between(11,99,_2桁の数字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/528 # # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # 1行の中に同じ単語が2連続しているのを1つだけにしたいです。 # # ●対象データ # appleapple # orangeorange # grapegrape # # ●希望する結果 # apple # orange # grape # # よろしくお願いします。 # # '1行の中に同じ単語が2連続しているのを1つだけにしたいです。'(_文字列,_短縮した文字列) :- findmax([Len,S],( sub_atom(_文字列,_,Len,_,S1,_,S3,_,L2,_), append(L,L,L2), atom_chars(S4,L), atomic_list_concat([S1,S4,S3],S)), [_,_短縮した文字列]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す'(InFile,OutFile) :- テキストファイルから文字列5行を読み込み(Infile,_文字列5行), 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび), 書き出す(OutFile,_右書きように置換された文字列ならび), テキストファイルから文字列5行を読み込み(Infile,_文字列5行) :- open(InFile,read,Instream), findall(_行,( between(1,5,N), get_line(Instream,_行)), _文字列5行), close(InFile). 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび) :- findmax(_行の長さ,( member(_行,_文字列5行), atom_length(_行,_行の長さ), _最長文字数), 空白文字を付加して文字数一致させる(_最長文字数,_文字列5行,_空白文字を付加して矩形にした文字列5行), 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2), 文字列に戻す(LL2,_右書き用に置換された文字列ならび). '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2) :- findall(L,( member(_行,_空白文字を付加して矩形にした文字列5行), atom_chars(_行,Chars), reverse(Chars,L)), LL1), 転置(LL1,LL2). 文字列に戻す(LL2,_右書き用に置換された文字列ならび) :- findall(_文字列,( member(Chars,LL2), atom_chars(_文字列,Chars)), _右書き用に置換された文字列ならび). 空白文字を付加して文字数を一致させる(_最大文字数,_文字列5行,_空白を付加した文字列5行) :- findall(_空白を付加された文字列,( member(_文字列,_文字列5行), atom_length(_文字列,_文字列長さ), 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列)), _空白を付加された文字列5行). 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列) :- _空白文字数 is _最大文字数 - _文字列の長さ, findall(' ',between(1,_空白文字数,_),_空白文字ならび), atomic_list_concat([_文字列|_空白文字ならび],_空白を付加された文字列). 書き出す(OutFile,_右書き用に置換された文字列ならび) :- open(OutFile,write,Outstream), append(_,[_行|R],_右書き用に置換された文字列ならび), writef(Outstream,'%t\n',[_行]), R = [], close(Outstream). % % この符にはfindall/3だけで表現するという主題がある。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/747 # # MySQL 5.5.29 # # ┏━┳━━┳━━┓ # ┃no┃.date┃名前┃ # ┣━╋━━╋━━┫ # ┃.1 ┃12-3┃榊  ┃ # ┣━╋━━╋━━┫ # ┃.2 ┃12-3┃山下┃ # ┣━╋━━╋━━┫ # ┃.3 ┃12-3┃斎藤┃ # ┣━╋━━╋━━┫ # ┃.4 ┃12-4┃山下┃ # ┣━╋━━╋━━┫ # ┃.5 ┃12-4┃斎藤┃ # ┗━┻━━┻━━┛ # # result: # no:1 # 名前:榊 # # このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したいと思っています。 # 当初は2回SQLを実行しPHPで配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。 # 宜しくお願いします。 # 'このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したい'(_絞込みdate,_名前) :- 前日に名前があり(_絞込みdate,_前日に名前があり), 当日に名前の消えている(_絞込みdate,_前日に名前があり,_当日に名前の消えている), データを抽出したい(_当日に名前の消えている,_名前). 前日に名前があり(_当日,_前日に名前があり) :- findmax(_date,( テーブル(_no,_date,_), _date @< _当日), _事実上の前日), setof(_名前,[_no,_事実上の前日,_名前] ^ ( テーブル(_no,_事実上の前日,_名前)), _前日に名前があり). 当日に名前の消えている(_当日,_前日に名前があり,_当日に名前の消えている) :- setof(_名前,[_no,_当日,_名前] ^ ( member(_名前,_前日に名前があり), \+(テーブル(_no,_当日,_名前))), _当日に名前の消えている). データを抽出したい(_当日に名前の消えている,_名前) :- member(_名前,_当日に名前の消えている). % 以下のサイトは # # mysql 5.5.9 # master # code # last_tradingdate # # data_tbl # code # data1 # tradingdate # # で、data_tblにはcode毎に取引日が入っています # それでmasterのlast_tradingdateにcode毎の入力最新日をセット # したいのですが、どう書けばいいんでしょうか。 :- dynamic(master/2,data_tbl/3). 'master code last_tradingdate data_tbl code data1 tradingdate で、data_tblにはcode毎に取引日が入っています それでmasterのlast_tradingdateにcode毎の入力最新日をセット したいのですが、どう書けばいいんでしょうか。' :- findall([_code,_最終取引日],( master(_code,_), findmax(_trandingdate,( data_tble(_code,_,_tradingdate)), _最終取引日)), LL), masterの_last_tradingdateを書き換える(LL). masterの_last_tradingdateを書き換える(LL) :- append(_,[[_code,_最終取引日]|R],LL), retract(master(_code,_)), assertz(master(_code,_最終取引日)), R = []. % 以下のサイトは # # mysql 5.5.9 # master # code # last_tradingdate # # data_tbl # code # data1 # tradingdate # # で、data_tblにはcode毎に取引日が入っています # それでmasterのlast_tradingdateにcode毎の入力最新日をセット # したいのですが、どう書けばいいんでしょうか。 :- dynamic(master/2,data_tbl/3). 'master code last_tradingdate data_tbl code data1 tradingdate で、data_tblにはcode毎に取引日が入っています それでmasterのlast_tradingdateにcode毎の入力最新日をセット したいのですが、どう書けばいいんでしょうか。' :- findall([_code,_最終取引日],( master(_code,_), findmax(_trandingdate,( data_tble(_code,_,_tradingdate)), _最終取引日)), LL), masterの_last_tradingdateを書き換える(LL). masterの_last_tradingdateを書き換える([]). masterの_last_tradingdateを書き換える([[_code,_最終取引日]|R]) :- retract(master(_code,_)), assertz(master(_code,_最終取引日)), masterの_last_tradingdateを書き換える(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/311 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下のような入力が与えられたときに # 3 # 11010 # 01111 # 10101 # 01110 # 01100 # # 01011 # 01010 # 00100 # 00110 # 10100 # # 11110 # 01110 # 01101 # 01110 # 00001 # # 以下のように出力されるプログラムを作成してください。よろしくお願いします。 # 4 # 3 # 8 # '以下のような入力が与えられたときに 3 11010 01111 10101 01110 01100 01011 01010 00100 00110 10100 11110 01110 01101 01110 00001 以下のように出力されるプログラムを作成してください。よろしくお願いします。 4 3 8'(LL) :- プログラム(LL,_解), writef('%t\n',[_解]). プログラム(LL,_解) :- 転置(LL,LL1), '1の最大連続数を得る'(LL1,_最大連続数), '最大連続数の連続は何か所にあるか'(LL1,_最大連続数,_何か所), _解 is _最大連続数 * _何か所. '1の最大連続数を得る'(LL1,_最大連続数) :- '1の最大連続数を得る'(LL1,0,_最大連続数). '1の最大連続数を得る'([],_最大連続数,_最大連続数) :- !. '1の最大連続数を得る'([L|R],_最大連続数_1,_最大連続数) :- 'Lの最大連続数'(L,_連続数), _連続数 > _最大連続数_1, '1の最大連続数を得る'(R,_連続数,_最大連続数),!. '1の最大連続数を得る'([_|R],_最大連続数_1,_最大連続数) :- '1の最大連続数を得る'(R,_最大連続数_1,_最大連続数). 'Lの最大連続数'(L,_Lの最大連続数) :- findmax(_連続数,( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_連続数)), _Lの最大連続数). '1の連続数'(L1,L2,L3,_連続数) :- all(L2,1), \+(last(L1,1)), \+(L3 = [1|_]), length(L2,_連続数). '最大連続数の連続は何か所にあるか'([],_最大連続数,0) :- !. '最大連続数の連続は何か所にあるか'([L|R],_最大連続数,_何か所) :- length(L2,_最大連続数), count(( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_最大連続数)), Count), '最大連続数の連続は何か所にあるか'(R,_最大連続数,_何か所_1), _何か所 is _何か所_1 + Count. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/775 # # 【お題】 # コラッツ予想とは、「任意の0でない自然数nをとり、 # ・nが偶数の場合、nを2で割る # ・nが奇数の場合、nに3をかけて1を足す # という操作を繰り返すと、有限回で1に到達する」という主張である。 # # nからスタートして1に到達するまでのステップをsとしたとき、 # n = 1 .. 100000についてsを計算し、最長のsを出力せよ。 # # ただし、それぞれのnに対するsの計算は並列(スレッド、プロセス問わない)で行う事。 # # 'コラッツ予想とは、「任意の0でない自然数nをとり、 ・nが偶数の場合、nを2で割る ・nが奇数の場合、nに3をかけて1を足す という操作を繰り返すと、有限回で1に到達する」という主張である。 nからスタートして1に到達するまでのステップをsとしたとき、 n = 1 .. 100000についてsを計算し、最長のsを出力せよ。'(_n,_最長のs) :- findall(_Idならび,( between(1,100000,_n), message_queue_create(_Id), thread_create(コラッツの予想(_ID,_n),_,[])), _Idならび), 最長のsを出力する(_Idならび). コラッツの予想(_ID,_n) :- コラッツの予想(_n,0,_回数), thread_send_massage(_ID,_回数). コラッツの予想(1,_回数,_回数) :- !. コラッツの予想(_n,_回数_1,_回数) :- 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2), _回数_2 is _回数_1 + 1, コラッツの予想(_n_2,_回数_2,_回数),!. 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,n_2) :- 'nが偶数の場合、nを2で割る'(_n,_n_2). 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2). 'nが偶数の場合、nを2で割る'(_n,_n_2) :- _n_2 is _n // 2. 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 1 is _n mod 2, _n_2 is _n * 3 + 1. 最長のsを出力する(_Idならび) :- findmax(_n,( between(1,100000,_), repeat, thread_get_massage(_Id,_n)), _最長のs), writef('最長のsは %t です。\n',[_最長のs]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/775 # # 【お題】 # コラッツ予想とは、「任意の0でない自然数nをとり、 # ・nが偶数の場合、nを2で割る # ・nが奇数の場合、nに3をかけて1を足す # という操作を繰り返すと、有限回で1に到達する」という主張である。 # # nからスタートして1に到達するまでのステップをsとしたとき、 # n = 1 .. 100000についてsを計算し、最長のsを出力せよ。 # # ただし、それぞれのnに対するsの計算は並列(スレッド、プロセス問わない)で行う事。 # # 'コラッツ予想とは、「任意の0でない自然数nをとり、 ・nが偶数の場合、nを2で割る ・nが奇数の場合、nに3をかけて1を足す という操作を繰り返すと、有限回で1に到達する」という主張である。 nからスタートして1に到達するまでのステップをsとしたとき、 n = 1 .. 100000についてsを計算し、最長のsを出力せよ。'(_n,_最長のs) :- findmax(_回数,( between(1,100000,_n), コラッツの予想(_n,_回数)), _最長のs). コラッツの予想(_n,_回数) :- コラッツの予想(_n,0,_回数). コラッツの予想(1,_回数,_回数) :- !. コラッツの予想(_n,_回数_1,_回数) :- 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2), _回数_2 is _回数_1 + 1, コラッツの予想(_n_2,_回数_2,_回数),!. 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,n_2) :- 'nが偶数の場合、nを2で割る'(_n,_n_2). 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2). 'nが偶数の場合、nを2で割る'(_n,_n_2) :- _n_2 is _n // 2. 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 1 is _n mod 2, _n_2 is _n * 3 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/271 # # Oracle11gR2で # # ID  Count # 1 3 # 2 2 # 3 3 # # こういうデータを元に # # Seq ID # 1 1 # 2 1 # 3 1 # 4 2 # 5 2 # 6 3 # 7 3 # 8 3 # # こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい? # Seqはなくてもいい # 'ID  Count 1 3 2 2 3 3 こういうデータを元に Seq ID 1 1 2 1 3 1 4 2 5 2 6 3 7 3 8 3 こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?'(_テーブル名,_Seq,_ID) :- 実行項の生成(_テーブル名,_ID,_実行項), 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび), sort(_ID_頻度ならび,_整列した_ID_頻度ならび), 'Seq組を生成'(1,_整列した_ID_頻度ならび,_Seq,_ID). 実行項の生成(_テーブル名,_ID,_実行項) :- findmax(Nth1,テーブル定義(_テーブル名,Nth1,_),_組の要素数), length(L,_組の要素数), _実行項 =.. [_テーブル名|L], テーブル定義(_テーブル名,_IDの位置,'ID'), nth1(_IDの位置,L,_ID). 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび) :- setof(_ID,[_ID,_実行項] ^_実行項,_IDならび), findall([_ID,_頻度],( member(_ID,_IDならび), count(_実行項,_頻度ならび)),_ID_頻度ならび). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度 - 1, between(N_1,N_2,_Seq). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度, 'Seq組を生成'(N_2,R,_Seq,_ID). % 以下のサイトは # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):() # # アルファベット小文字からなる文字列 s が与えられる. # s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい. # 最小何文字削除すれば回文となるか計算するプログラムを作れ. # なお,s の文字数は 100000 以下としてよい. # # 例: # s = ababba → 1 (右から 2 番目の b を消して ababa) # s = abcdef → 5 (1 文字残して残りを削除する) # # # [3] 環境 #  [3.1,2] OS,コンパイラ: 問わず #  [3.3] 言語: どちらでも可 # [4] 期限: 2008/06/08 # [5] その他の制限: 特に無し 'アルファベット小文字からなる文字列 s が与えられる.s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.' :- 'アルファベット小文字からなる文字列 s が与えられる'(_s), 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む), writef('最小 %t 文字の削除で回文は出来上がります\n',[_最小何文字の削除で済む]),!. 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む) :- sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2), atom_length(_s,_文字列数), findmax(_回文の文字数,( 回文を生成(Chars_1,Chars_2,0,_回文の文字数)), _回文は最大何文字), _最小何文字の削除で済む is _文字列数 - _回文は最大何文字. sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2) :- atom_chars(_s,Chars_1), reverse(Chars_1,Chars_2). 回文を生成([],_,N,N). 回文を生成([A|R1],[A|R2],N_1,N) :- N_2 is N_1 + 1, 回文を生成(R1,R2,N_2,N). 回文を生成(L1,[B|R2],N_1,N) :- 回文を生成(L1,R2,N_1,N). 回文を生成([_|R1],L2,N_1,N) :- 回文を生成(R1,L2,N_1,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/205 # # MS SQL server 2012です。 # TableA # 商品名 製造数 # A 1000 # B 2000 # C 1000 # # TableB # 商品名 単価 # A 100 # A 120 # B 90 # C 120 # C 125 # # TableBには同一商品名で複数の単価が登録されています。 # TableBの商品名毎の一番高い単価を基にして # TableAの製造数 x 単価を求めたいのですが # 一発で出す方法有りましたら教えてください。 # # 得たい結果 # A 12000 # B 18000 # C 12500 # # 'TableBには同一商品名で複数の単価が登録されています。 TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'(_商品名,_金額) :- setof(_商品名,[_商品名,_単価] ^ ( テーブルB(_商品名,_単価)),_商品名ならび), 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'(_商品名ならび,_商品名,_金額). 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'([_商品名|R1],_商品名,_金額) :- findmax(_単価,( テーブルB(_商品名,_単価)), _一番高い単価), テーブルA(_商品名,_製造数), _金額 is _一番高い単価 * _製造数. 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'([_|R1],_商品名,_金額) :- 'TableBの商品名毎の一番高い単価を基にしてTableAの製造数 x 単価を求める'(R1,_商品名,_金額). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #154 # Oracle10g # # 企業TBL # 1:企業ID # 2:企業名 # 3:電話番号 # 4:最終発送日 # # 上記のようなテーブルがあり、同一企業でも # 複数のレコードに登録されています。 # 電話番号が同一であれば、同一企業とみなし、 # 最終発送日を同一企業内で最新の日付で # 一斉更新したいのですが、プログラムを使わず # SQL文だけで完結することは可能でしょうか? # # 下記のSQLで表示される電話番号のデータを # MAX(最終発送日)で更新するイメージです。 # # SELECT 電話番号,MAX(最終発送日),COUNT(*) # FROM 企業TBL # GROUP BY 電話番号 # HAVING COUNT(*) > 1; # '同一企業でも複数のレコードに登録されています。電話番号が同一であれば、同一企業とみなし、最終発送日を同一企業内で最新の日付で一斉更新したい' :- 電話番号ならびを得る(_電話番号ならび), 電話番号_最終発送日ならび(_電話番号ならび,_電話番号_最終発送日ならび), 最終発送日の更新(_電話番号_最終発送日ならび). 電話番号ならびを得る(_電話番号ならび) :- setof(_電話番号,[_企業ID,_企業名,_電話番号,_最終発送日] ^ ( 企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)),_電話番号ならび). 電話番号_最終発送日ならび(_電話番号ならび,_電話番号_最終発送日ならび) :- findall([_電話番号,_最終発送日],( member(_電話番号,_電話番号ならび), 最終発送日(_電話番号,_最終発送日)),_電話番号_最終発送日ならび). 最終発送日(_電話番号,_最終発送日) :- findmax(_最終発送日,( 企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)),_最終発送日). 最終発送日の更新(_電話番号_最終発送日ならび) :- forall(member([_電話番号,_最終発送日],_電話番号_最終発送日ならび), 最終発送日の更新(_電話番号,_最終発送日)). 最終発送日の更新(_電話番号,_最終発送日) :- 電話番号を鍵に企業データを削除(_電話番号), assertz(企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)). 電話番号を鍵に企業データを削除(_電話番号) :- retract(企業TBL(_企業ID,_企業名,_電話番号,_最終発送日_1)), fail. 電話番号を鍵に企業データを削除(_電話番号). findmax(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,_最大値) :- select(_最大値,L,R), forall(member(A,R),_最大値 @>= A). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 最大値([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値(L,_最大値) :- 第一要素を現在の最大値と置いて最大値を走査(L,_最大値). 第一要素を現在の最大値と置いて最大値を走査([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値). 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値) :- 'AがBを上回った場合だけ差し替える'([A|R],B,_最大値). 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値) :- それ以外はそのまま検索する([A|R],B,_最大値). 'AがBを上回った場合だけ差し替える'([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). それ以外はそのまま検索する([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値(L,_最大値) :- 第一要素を現在の最大値と置いて最大値を走査(L,_最大値). 第一要素を現在の最大値と置いて最大値を走査([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- 'A @> B の場合はBをAに差し替える'([A|R],B,_最大値). 最大値([A|R],B,_最大値) :- 'A @=< B の場合はBに変化なし'([A|R],B,_最大値). 'A @> B の場合はBをAに差し替える'([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 'A @=< B の場合はBに変化なし'([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/959 # # MySQL 5.1です。 # # テーブル1 # 15:30:20 カツ丼 # 15:35:40 天丼 # 15:50:15 他人丼 # # テーブル2 # 15:30:30 400円 # 15:35:45 550円 # 15:51:00 480円 # # というテーブルがあって、テーブル1と2の時刻が近いものをマッチさせて # 15:30:20 カツ丼 400円 # 15:35:40 天丼 550円 # 15:50:15 他人丼 480円 # # のような結果を出したいのですが、どのようにすればいいでしょうか。 # # よろしくお願いします。 # # テーブル1と2の時刻が近いものをマッチさせる(_時刻,_商品名,_価格) :- テーブル1(_時刻,_商品名), テーブル1と2の時刻が近いもの(_時刻,_時刻以前,_時刻以後), 時刻が近いものをマッチさせる(_時刻,_時刻以前,_時刻以後,_価格). テーブル1と2の時刻が近いもの(_時刻,_時刻以前,_時刻以後) :- findmax(_時刻_2,( テーブル2(_時刻_2,_価格), _時刻 @>= _時刻_2), _時刻以前), findmin(_時刻_2,( テーブル2(_時刻_2,_価格), _時刻 @=< _時刻_2), _時刻以後). 時刻が近いものをマッチさせる(_,[],_時刻以後,_価格) :- テーブル2(_時刻以後,_価格),!. 時刻が近いものをマッチさせる(_,_時刻以前,[],_価格) :- テーブル2(_時刻以前,_価格),!. 時刻が近いものをマッチさせる(_時刻,_時刻以前,_時刻以後,_価格) :- '時刻を秒単位に変換してから、近い時刻を得る'(_時刻,_時刻以前,_時刻以後,_近い時刻), テーブル2(_近い時刻,_価格). '時刻を秒単位に変換してから、近い時刻を得る'(_時刻,_時刻以前,_時刻以後,_近い時刻) :- 時刻を秒単位に変換して(_時刻,_秒), 時刻を秒単位に変換して(_時刻以前,_秒_1), 時刻を秒単位に変換して(_時刻以後,_秒_2), 近い時刻を得る(_秒,_時刻以前,_秒_1,_時刻以後,_秒_2,_近い時刻). 時刻を秒単位に変換して(_時_1,_分_1,_秒_1,_秒) :- _秒 is 3600 * _時_1 + 60 * _分_1 + _秒_1. 近い時刻を得る(_秒,_時刻以前,_秒_1,_時刻以後,_秒_2,_時刻以前) :- abs(_秒_1 - _秒) =< abs(_秒_2 - _秒),!. 近い時刻を得る(_秒,_時刻以前,_秒_1,_時刻以後,_秒_2,_時刻以後). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/953 # # MySQL5.1 # # セール価格表(P) # 商品CD 適用日 単価 # aaa 2012-08-01 2500 # aaa 2012-08-20 3000 # bbb 2012-08-01 10000 # bbb 2012-08-15 8500 # # 予約表(Y) # 商品CD 購入日 数量 # aaa 2012-08-01 2 # aaa 2012-08-05 3 # aaa 2012-08-25 1 # bbb 2012-08-13 4 # bbb 2012-08-19 5 # # ほしい表 # aaa 2012-08-01 2 2500 # aaa 2012-08-05 3 2500 # aaa 2012-08-25 1 3000 # bbb 2012-08-13 4 10000 # bbb 2012-08-19 5 8500 # # 購入日時点で適用日以降の単価が反映された表を得るにはどうしたらいいでしょうか # # '購入日時点で適用日以降の単価が反映された表を得る'(_商品CD,_購入日,_数量,_単価) :- 予約表(_商品CD,_購入日,_数量), '購入日時点で適用日以降の単価が反映された表を得る'(_商品CD,_購入日,_単価). '購入日時点で適用日以降の単価が反映された表を得る'(_商品CD,_購入日,_単価) :- findmax([_適用日,_単価],( セール価格表(_商品CD,_適用日,_単価), _購入日 @>= _適用日), [_適用日,_単価]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/935 # # [1] 授業単元:C言語演習 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つ構造体を考える。 #  氏名 : 文字型 name[20] #  英語得点 : 整数型 eigo #  国語得点 : 整数型 kokugo #  数学 : 整数型 sugaku # SCORE型の構造体配列data[5]を宣言せよ。 # そしてキーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力するプログラムを作成せよ。 # <データ例> # 番号 氏名 英語得点 国語得点 数学得点 # 1  nakashima 75   70    75 # 2  takada  85   65    70 # 3  arita   80   80    80 # 4  shimane  65   75    55 # 5  hirakata 70   77    90 # <出力例> # 英語 takada 85 # 国語 arita 80 # 数学 hirakata 90 # 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- length(Ln,5), 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln), '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する'. 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([]). 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([_|Ln]) :- 'データ(番号、氏名、各教科の得点)を入力すると', 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln). 'データ(番号、氏名、各教科の得点)を入力すると' :- 変数XXを得る(XX), 整数を得る(番号,_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点), 成績を定義する(XX,_番号,_氏名,_英語の得点,_国語の得点,_数学の得点). 氏名を得る(_氏名) :- write('氏名 : '), get_line(_氏名). 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- append(_,[_教科|R],[英語,国語,数学]), 教科の最高得点を得る(_教科,_氏名,_最高得点), writef('%t の最高得点者は %t 得点は %t\n',[_教科,_氏名,_最高得点]). R = []. 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語,_英語得点)), assertz(成績(_XX,国語,_国語得点)), assertz(成績(_XX,数学,_数学得点)),!. 教科の最高得点を得る(_教科,_氏名,_最高得点) :- findmax([_得点,_氏名],( 成績(XX,_教科,_得点), 成績(XX,氏名,_氏名)), _最高得点). 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/911 # # 【質問テンプレ】 # ・SQLite3 # ・テーブル # id,unixtime # 100001,1341404056 # 100001,1341997094 # 100001,1341987930 # 100002,1341997860 # 100002,1341989037 # # ・欲しい結果 # 100001,1341997094 # 100002,1341997860 # # ・説明 # 上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出すには # どのようなクエリでできるでしょうか。1回では無理でしょうか。 # # id,unixtime,value # "1" "1341404056" "内容1" # "1" "1341997094" "内容2" # "1" "1341987930" "内容3" # "2" "1341997860" "内容1" # "2" "1341989037" "内容2" # '上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出す'(_id,_unixtime,_value) :- setof(_id,[_id,_unixtime,_value] ^ ( テーブル(_id,_unixtime,_value)),L1), member(_id,L1), findmax([_unixtime,_id,_value],( テーブル(_id,_unixtime,_value)),[_unixtime,_id,_value]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/787 # # id5とid10という2つの情報しかないのですが # id5がもつc1とid10がもつc1を交換するとき # どういうクエリーをかけばよいでしょうか? # # 1.select c1 from t where id=5 or id=10 order by id # 2.begin transaction # 3.update t set c1=? where id=5 (?は1でとったid10のc1値) # 4.update t set c1=? where id=10 (?は1でとったid5のc1値) # 5.commit # # 自分の能力ではこんな手順が限界ですが # サブクエリーを駆使したらupdate1文でいけたりするのでしょうか? # もしできたらどんな感じの文になるか教えていただきたいです # 'id5とid10という2つの情報しかないのですがid5がもつc1とid10がもつc1を交換する' :- '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置), idが5の処理(_引数の数,_c1の位置,_idの位置), idが10の処理(_引数の数,_c1の位置,_idの位置), 交換する(L0_1,L0_2,R1,R2). '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置) :- findmax(_位置,( テーブル定義(t,_位置,_), _引数の数), テーブル定義(t,_c1の位置,c1), テーブル定義(t,_idの位置,id). idが5の処理(_引数の数,_c1の位置,_idの位置,L0_1,R1) :- 'idが5のデータを一旦削除する'(_引数の数,_c1の位置,_idの位置,L1), 'L1をc1の前と後に分解'(L1,L0_1,R1). idが5のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L1) :- length(L1,_引数の数), P =.. [t|L1], nth1(_c1の位置,L1,_c1_1), nth1(_idの位置,L1,5), retract(P). idが10の処理(_引数の数,_c1の位置,_idの位置,L0_2,R2) :- idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2), 'L1をc1の前と後に分解'(L2,L0_2,R2). idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2) :- length(L2,_引数の数), P =.. [t|L2], nth1(_c1の位置,L2,_c1_2), nth1(_idの位置,L2,10), retract(P). 'L1をc1の前と後に分解'(L1,L0_1,R1) :- length([_|L0_1],_c1の位置), append(L0_1,[A|R1],L1). 交換して定義する(L0_1,L0_2,R1,R2) :- append(L0_1,[B|R1],L1), append(L0_2,[A|R2],L2), P_1 =.. [t|L1], P_2 =.. [t|L2], asserta(P_1), asserta(P_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/770 # # すまん、763です。具体的に言うと # 株価Tab(時刻、株価) # 為替Tab(時刻、ドル・円為替レート) # を株価のテーブルをメインにして # SELECT時刻、株価、ドル・円為替レート # にしたいんだけど株価と為替の時刻は当然一致していないけど、 # 株価の時刻からみて最新の為替レートを表示したいんです。 # よろしくおねがいします。 # # '時刻、株価、ドル・円為替レート'(_時刻,_株価_円,_ドル円為替レート) :- 株価(_時刻,_株価_ドル), 株価(_時刻,_株価_ドル,_株価_円,_ドル円為替レート). 株価(_時刻,_株価_ドル,_株価_円,_ドル円為替レート) :- findmax([_時刻_1,_ドル円為替レート],( 為替(_時刻_1,_ドル円為替レート), _時刻_1 @=< _時刻), [_,_ドル円為替レート]), _株価_円 is _ドル円為替レート * _株価_ドル. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/763 # # A Table # a1 a2 # -- -- # 1 A # 3 B # 5 C # 6 D # # B Table # b1 b2 # -- -- # 2 E # 4 F # 6 G # # を select で # a1 a2 b1 b2 # -- -- -- -- # 1 A null null # 3 B 2 E # 5 C 4 F # 6 D 6 G # # にしたいけど、どうしたらいいでしょうか? 'A テーブルの_a1をキーに、B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める' :- 'A テーブルの_a1をキーに'(_a1,_a2), 'B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(_a1,_b1_b2). 'A テーブルの_a1をキーに'(_a1,_a2) :- 'A テーブル'(_a1,_a2). 'B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(_a1,_b1_b2) :- setof(_b1,[_b1,_b2,_a1] ^ ( 'B Table'(_b1,_b2), _b1 @=< _a1),L1), 'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(L1,B1,B2). 'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'([],'','') :- !. 'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(L,B1,B2) :- findmax(B1,( member(B1,L)),MaxB1), findmax([MaxB1,B2],( 'B Table'(MaxB1,B2)),[B1,B2]). % findmax/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/763 # # A Table # a1 a2 # -- -- # 1 A # 3 B # 5 C # 6 D # # B Table # b1 b2 # -- -- # 2 E # 4 F # 6 G # # を select で # a1 a2 b1 b2 # -- -- -- -- # 1 A null null # 3 B 2 E # 5 C 4 F # 6 D 6 G # # にしたいけど、どうしたらいいでしょうか? 'A Table \n a1 a2 \n -- -- \n 1 A \n 3 B \n 5 C \n 6 D \n B Table \n b1 b2 \n -- -- \n 2 E \n 4 F \n 6 G \n を \n a1 a2 b1 b2 \n -- -- -- -- \n 1 A null null \n 3 B 2 E \n 5 C 4 F \n 6 D 6 G にしたい'(_a1,_a2,_b1,_b2) :- 'A テーブルの_aをキーにB テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'. 'A テーブルの_aをキーにB テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める' :- 'A Table'(_a1,_a2), 'B Table の中で _b1 の値が _a1 に等しいか最も近い組'(_a1,_b1,_b2). 'B Table の中で _b1 の値が _a1 に等しいか最も近い組'(_a1,B1,B2) :- setof(_b1,[_b1,_b2,_a1] ^ ( 'B Table'(_b1,_b2), _b1 @=< _a1),L1), '_b1の最大値'(L1,B1,B2). '_b1の最大値'(L,'','') :- 'L が[]の時はB1,B2はそれぞれnull'(L). '_b1の最大値'(L,B1,B2) :- findmax(B1,( member(B1,L)),MaxB1), findmax([MaxB1,B2],( 'B Table'(MaxB1,B2)),[B1,B2]) 'L が[]の時はB1,B2はそれぞれnull'([]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/649 # # SQLというよりテーブル設計の質問なんですがいいでしょうか? # # ユーザごとの日々変化するデータを1日1レコードずつ保存するために # 以下のようなテーブル構造を考えました。 # # USERSテーブル #  user_no (ユーザ番号 PK) #  latest_gen_no (最新世代番号) #  氏名その他の属性 # # RECORDSテーブル #  user_no (ユーザ番号 PK*) #  gen_no (世代番号 PK*) #  日々変化する値 # *user_no, gen_no のペアでPK # # GENERATIONSテーブル #  gen_no (世代番号 PK) #  date (日時) # # 全ユーザの最新世代の値を取得するべく、 # select ... from users u, records r # where u.user_no=r.user_no and u.latest_gen_no=r.gen_no; # というSQLを発行すると、ものすごく時間が掛かります。 # # PKやインデックスの設定の仕方に問題があるのでしょうか? # そもそもテーブルの構成がまずいでしょうか? # テーブル副目標(_テーブル名,_引数ならび,_属性名ならび,_副目標) :- findall(_,テーブル定義(_テーブル名,_,_属性名),_引数ならび), findall(_属性名,テーブル定義(_テーブル名,_,_属性名),_属性名ならび), _副目標 =.. [_テーブル名|_引数ならび]. 'USERSテーブルを最新世代に更新する' :- ユーザごとの現在の最新世代を得る(_ユーザごとの最新世代ならび), 'USERSテーブルを更新する'(_ユーザごとの最新世代ならび). ユーザごとの現在の最新世代を得る(_ユーザごとの最新世代ならび) :- 'テーブル副目標'('USERS',[_ユーザ番号,_最新世代番号|_氏名その他の属性],_,_USERS), findsetof(_ユーザ番号,( _USERS), _対象ユーザ番号ならび), ユーザごとの現在の最新世代を得る(_対象ユーザ番号ならび,_ユーザごとの最新世代ならび). ユーザごとの現在の最新世代を得る([],[]). ユーザごとの現在の最新世代を得る([_ユーザ番号|R1],[[_ユーザ番号,_最新世代番号]|R2]) :- テーブル副目標('RECORDS',[_ユーザ番号,_世代番号|_],_,_RECORDS), findmax([_日時,_世代番号],( _RECORDS, 'GENERATIONS'(_世代番号,_日時)), [_,_最新世代番号]), ユーザごとの現在の最新世代を得る(R1,R2). 'USERSテーブルを更新する'([]). 'USERSテーブルを更新する'([[_ユーザ番号,_最新世代番号]|R]) :- テーブル副目標('USERS',[_ユーザ番号,_|_氏名その他の属性],_,_USERS_1), テーブル副目標('USERS',[_ユーザ番号,_最新世代番号|_氏名その他の属性],_,_USERS_2), retract(_USERS_1), assertz(_USERS_2), 'USERSテーブルを更新する'(R),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/728 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ.ただし構造体とポインタを使用すること. # 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_開始単語,_最長しりとり) :- findmax([_長さ,L],( 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_開始単語,[],L,_長さ)), [_長さ,_最長しりとり]). 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_単語_1,L1,L,_長さ) :- しりとり(_単語_1,L1,_単語_2), 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_単語_2,[_単語_1|L1],L,_長さ). 'あたえられた単語で文字数が最長となるようなしりとりをプログラムしパターンと文字数を導出せよ'(_単語_1,L,[_単語_1|L],_長さ) :- length([_単語_1|L],_長さ). しりとり(_単語_1,L,_単語_2) :- 単語(_単語_2), \+(member(_単語_2,[_単語_1|L])), sub_atom(_単語_1,_,1,0,_開始文字), sub_atom(_単語_2,0,1,_,開始文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/610 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): 最長しりとり問題を整数計画法を用い、しりとりの数が最長となるパターンを導出するプログラムを作成せよ.ただし構造体とポインタを使用すること. # 'しりとりの数が最長となるパターンを導出する'(_しりとりの数が最長となるパターン) :- しりとり節を定義, findmax([_長さ,_節番号ならび],( しりとり(_長さ,_節番号ならび)), [_長さ,_節番号ならび]), 節番号ならびを語彙ならびに変換(_節番号ならび,_しりとりの数が最長となるパターン). しりとり(_長さ,_節番号ならび) :- しりとり節(_,_節番号,_先頭文字,_末尾文字), しりとり(_先頭文字,[],_節番号ならび), length(L,_長さ). しりとり(_先頭文字,L2,_節番号ならび) :- しりとり節(_,_節番号,_先頭文字,_末尾文字), \+(member(_節番号,L2)), しりとり(_末尾文字,[_節番号|L2],_節番号ならび). しりとり(_,L2,L) :- reverse(L2,L). 節番号ならびを語彙ならびに変換([],[]). 節番号ならびを語彙ならびに変換([_節番号|R1],[_語彙|R2]) :- しりとり節(_語彙,_節番号,_,_), 節番号ならびを語彙ならびに変換(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% しりとり節を定義 :- findall(_語彙,( 語彙(_語彙)), _語彙ならび), sort(_語彙ならび,_整列した語彙ならび), しりとり節を定義(0,_整列した語彙ならび). しりとり節を定義(_,[]). しりとり節を定義(N,[_語彙|R]) :- 節を定義(N,_語彙), N_2 is N + 1, しりとり節を定義(N_2,R). 節を定義(N,_語彙) :- sub_atom(_語彙,0,1,_,_先頭文字), sub_atom(_語彙,_,1,0,_末尾文字), assertz(しりとり節(_語彙,N,_先頭文字,_末尾文字)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 117匹目 #333 # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # # 文字列を検索して、適合パターンを置換していく # 1) 文字列の先頭から検索パターンに適合する文字列の前の文字列 # 2) 検索パターンに適合した文字列 # 3) 検索パターンに適合した文字列より後の文字列 # # 2) 検索パターンに適合した文字列を置換文字列に置き換える # 置換文字列定義(def,'DEF'). '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- 全ての置換回数を計測した置換された文字列ならび(_文字列,LL), 置換回数が最大になるような置換された文字列(LL,_置換された文字列). 全ての置換回数を計測した置換された文字列ならび(_文字列,LL) :- findall([_置換された回数,_置換された文字列],( '置換パターン'(_文字列,_置換された回数,_置換された文字列)),LL). 置換回数が最大になるような置換された文字列(LL,_置換された文字列) :- 置換回数が最大に(LL,_最大数), なるように置換された文字列(LL,_最大数,_置換された文字列). 置換回数が最大に(LL,_最大数) :- findmax(N,member([N,_],LL),_最大数). なるように置換された文字列(LL,_最大数,_置換された文字列) :- member([_最大数,_置換された文字列],LL). '置換パターン'(_文字列,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_文字列,0,_置換された回数,_置換された文字列). '置換回数付き置換パターン'(_文字列,_置換された回数_1,_置換された回数,_置換された文字列) :- 置換対象文字列を得る(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), succ(_置換された回数_1,_置換された回数_2), '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_2,_置換された回数,_置換された文字列). 置換対象文字列を得る(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1) :- sub_atom(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), 置換文字列定義(_適合文字列_1,_置換する文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数,_置換された回数,_置換された文字列) :- atomic_list_concat([_前文字列_1,_置換する文字列,_後文字列_1],_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列_2), atomic_list_concat([_前文字列_1,_置換する文字列,_置換された文字列_2],_置換された文字列). findmax(_射影項,_目標,_最大数) :- findall(_射影項,_目標,_解ならび), 最大値を取り出す(_解ならび,_最大数). 最大値を取り出す(_解ならび,_最大数) :- sort(_解ならび,_整列した解ならび), last(_整列した解ならび,_最大数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- findall([_置換回数,_置換された文字列],( '置換回数を数えながら文字列置換'(_文字列,_置換回数,_置換された文字列)), LL), findmax(N,( member([N,_],LL)), Max), member([Max,_置換された文字列],LL). '置換回数を数えながら文字列置換'(_文字列,_置換回数,_置換された文字列) :- 置換文字列定義を差分リストに変換する, atom_chars(_文字列,Chars), '置換回数を数えながらならび置換'(Chars,_置換回数,_置換されたChars), _置換回数 > 0, atom_chars(_置換された文字列,_置換されたChars). '置換回数を数えながらならび置換'([],0,[]). '置換回数を数えながらならび置換'(L1,N,L2) :- 置換ならび定義(L1,R1,L2,R2), '置換回数を数えながらならび置換'(R1,N2,R2), N is N2 + 1. '置換回数を数えながらならび置換'([A|R1],N,[A|R2]) :- '置換回数を数えながらならび置換'(R1,N,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 置換文字列定義を差分リストに変換する :- abolish(置換ならび定義/4), clause(置換文字列定義(_文字列,_置換する文字列),_本体), 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2), assertz((置換ならび定義(L1,R1,L2,R2) :- _本体)), fail. 置換文字列定義を差分リストに変換する. 差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2) :- atom_chars(_文字列,Chars_1), atom_chars(_置換する文字列,Chars_2), append(Chars_1,R1,L1), append(Chars_2,R2,L2). % 以下のサイトは # 出典::SQL質疑応答スレ 12問目 #353 # MySQL 5.1 # 株価テーブル kabuka # stock_code ←銘柄コード # vol_date ←出来高年月日 # sp # hp # lp # cp # vol # # 銘柄マスタ stock_info # stoc_code ←銘柄コード # shkbn ←商品区分(0,1,2,3,4) # stk_name ← 銘柄名 # delete_flg 削除区分 # 〜その他いろいろな項目 # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい # # select a.stock_code,stk_name,shkbn,min(vol_date),max(vol_date) # from kabuka a # inner join stock_info b # on a.stock_code = b.stock_code # where # a.stock_code in # (select b.stock_code from stock_info # where delete_flg=0 and shkbn not in(0,4)) # group by a.stock_code # order by shkbn,a.stock_code; # # で、上記のSQLを書いてみたんですが、shkbnが0及び4のもでてしまいます # 出さないようにするにはどうすればいいのでしょうか? # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい :- 一覧を出したい(銘柄マスタの商品区分0及び1は除外して(_銘柄,_銘柄名), 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を表示する(_銘柄,_銘柄名)). 一覧を出したい(_表示対象,_表示する) :- forall(_表示対象,_表示する). 銘柄マスタの商品区分0及び1は除外して(_銘柄,_銘柄名) :- setof([_stoc_code,_stk_name],( [_stoc_code,_shkbn,_stk_name,_delete_flg] ^ stock_info(_stoc_code,_shkbn,_stk_name,_delete_flg), 商品区分0及び1は除外して(_shkbn)),LL), member([_銘柄,_銘柄名],LL). 商品区分0及び1は除外して(_shkbn) :- _shkbn=\=0, _shkbn=\=1. 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を表示する(_stock_code,_銘柄名) :- 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を(_stock_code,_最古登録日,_最新登録日), writef('%t,%t,最古登録日=%t,最新登録日=%t\n',[_stoc_code,_銘柄名,_最古登録日,_最新登録日]). 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を(_stock_code,_最古登録日,_最新登録日) :- '銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と'(_stock_code,_最古登録日), 最新登録日を(_stock_code,_最新登録日). 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と(_stock_code,_最古登録日) :- findmin(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最古登録日). 最新登録日を(_stock_code,_最新登録日) :- findmax(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最新登録日). findmin(A,B,C) :- findall(A,B,L), 昇順整列した最初の要素(L1,C). 昇順整列した最初の要素(L1,C) :- sort(L,[C|_]). findmax(A,B,C) :- findall(A,B,L1), 昇順整列した最終要素(L1,C). 昇順整列した最終要素(L1,C) :- sort(L1,L2), last(L2,C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/323 # # 【質問テンプレ】 # ・DBMS名とバージョン MySQL 5.1 # ・テーブルデータ # ・欲しい結果 # ・説明 # # テーブル「カート」 # カラム 「セッションID」「商品種別」「カートに入れた時刻」 # # テーブル「カート詳細」 # カラム 「セッションID」「商品コード」 # # テーブル「商品リスト」 # カラム「商品コード」「商品種別」 # # というテーブルがあります。 # # 最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、 # そのセッションIDを持つレコードを「カート」「カート詳細」の両方から # 全て削除したいのです。 # # 同じセッションIDを持つレコードは、両方のテーブルに複数あります。 # 「注文」テーブルで「セッションID」「商品種別」の組合せはユニークで、 # 「注文詳細」テーブルでは「セッションID」「商品コード」の組合せにユニークです。 # # 結合や副問い合わせを試してみましたが、うまいこと抽出できません。 # SQLで書くやり方があれば教えてください。よろしくお願いします。 # # '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する' :- '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R), 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID), R = []. '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R) :- findsetof(_セッションID,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _セッションIDならび), append(_,[_セッションID|R],_セッションIDならび), findmax(_カートに入れた時刻,( カート(_セッションID,_商品種別,_カートに入れた時刻)), _最後にカートに入れた時刻), 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻). 'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID) :- retractall(カート(_セッションID,_,_)), retractall(カート詳細(_セッションID,_)). 最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻) :- split(_最後に入れた時刻,['/',' ',':'],[_年,_月,_日,_時,_分]), 現在の時刻(_年_1,_月_1,_日_1,_時_1,_分_1), '12時間後の日時'(_年,_月,_日,_時,_分,_年_2,_月_2,_日_2,_時_2,_分_2), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= [_年_2,_月_2,_日_2,_時_2,_分_2],!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日,_時_2,_分) :- _時_2 is _時 + 12, _時_2 < 24,!. '12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日_2,_時_2,_分) :- _時_1 is _時 + 12, _時_2 is _時_1 - 24, _日_2 is _日 + 1,!. retractall(P) :- retract(P), fail. retractall(_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/147 # # 特定のidが持つintカラムから最も近いかつ小さい数字を持つidを求めたいのですが、 # # select id from t1 where int_col < (select int_col from t1 where id=特定のid) order by int_col desc # でできたのですが # もっとよいSQLありませんか? # # '特定のidが持つintカラムから最も近いかつ小さい数字を持つidを求める'(_id,_id_2) :- t1(_id,_int_col), findmax([_int_col_x,_id_x],( t1(_id_x,_int_col_x), _int_col_x < _int_col), [_int_col_2,_id_2]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/890 # # 初心者ですが失礼いたします。 # ID | DATA | TIME # --+------ # 1 | aaa | 01:02 # 2 | bbb | 03:42 # 1 | ccc | 02:11 # 3 | bbb | 01:32 # # というデータがあるとしまして # タイムが早い順に並べ替えて重複するIDを除外(この場合は1) # するにはどのようなクエリを書けばよいのでしょうか? # # select * from table ORDER BY `time` DESC # でタイム順には並べることができていますが重複するID(人物) # を除外したいのです。 # # % findsetof/3 % findmin/3 % を参照してください。 'タイムが早い順に並べ替えて重複するIDを除外する'(_ID,_DATA,_TIME) :- findsetof(_ID,( テーブル(_ID,_DATA,_TIME)), L1), append(_,[_ID|_],L1), findmax([_TIME,_ID,_DATA],( テーブル(_ID,_DATA,_TIME)), [_TIME,_ID,_DATA]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/804 # # [1] 授業単元:並列計算 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/UfRWs3k5 # # 課題 ナップザック問題をOpenMPで並列化し,並列化効率などについて分析せよ. # (1) ナップザック問題とはいくつかの荷物を袋に入れるときに最大の値段に # なるように袋に詰める,組み合わせを求める問題 # (2) N個の荷物があって,個々の荷物の重さをWi,値段をPiとする. # 袋には最大Wの重さまでいれられる.このとき,最大でいくら分を # いれることができるのかを求める. # (3) 幅優先探索型にする ナップザック問題(_重量限界,_最大金額) :- findall((_金額,_重み),( 荷物(_重み,_金額)), L1), length(L1,Len), findmax(金額合計,( for(1,M,Len), 組合せ(L,M,L2), 重さ合計(L2,_重さ合計), _重さ合計=<_重量限界, 金額合計(L2,_金額合計)), _最大金額). 金額合計([],0). 金額合計([(_金額,_)|R1],_合計金額) :- 金額合計(R1,_金額合計_1), _合計金額 is _合計金額_1 + _金額. 重さ合計([],0). 重さ合計([(_重さ,_)|R1],_合計重さ) :- 重さ合計(R1,_重さ合計_1), _合計重さ is _合計重さ_1 + _重さ. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/558 # # create table aaa ( # id integer not null, # test text not null, # test2 integer not null, # unique (id,test) # ); # # create table bbb ( # id integer not null, # test text not null, # test2 integer not null # unique (id,test) # ); # # aaa # id test test2 # 10 aaa 100 # 10 bbb 200 # 10 ccc 100 # 10 ddd 100 # # bbb # id test test2 # 10 aaa 200 # 10 bbb 100 # # ほしい結果 # id test test2 # 10 aaa 200 # 10 bbb 100 # 10 ccc 100 # 10 ddd 100 # aaa(10,111,200). aaa(10,bbb,100). bbb(10,aaa,200). bbb(10,bbb,100). bbb(10,ccc,100). bbb(10,ddd,100). ほしい結果(_id,_test,_test2) :- findall([_id,_test,_test2],( aaa(_id,_test,_test2)), LL1), findall([_id,_test,_test2],( bbb(_id,_test,_test2)), LL2), append(LL1,LL2,LL), findsetof([_id,_test],( append(_,[[_id,_test]|_],LL)), LL3), findmax([_test2,_id,_test],( append(_,[[_id,_test]|_],LL3), append(_,[[_id,_test,_test2]|_],LL)), LL4), append(_,[[_test2,_id,_test]|_],LL4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/719 # # # (1)%で始まっていればコマンドに応じた処理ができるように分岐処理を書く # %Q:プログラムの終了 # %C:メモリ中に保持しているデータの登録数を出力 # %P:0~99番目までの100人分のデータが登録されている場合 # %P 8 …0番目→7番目の順で表示 # %P -10 …90番目→99番目の順で表示 # 出力例: # # ID : 100023 # Name : Tokyo # Date : 1900/1/1 # Addr : Tokyoto....... # Memo : aaeiou 1234566.... # # ID : 100048 # Name : Osaka # Date : 1900/2/2 # Addr : Osakafu....... # Memo : abcde 124816.... # # (2)%で始まっていなければデータを格納 # (3)ループするようにしておいて何行でも入力可能にする(%Qでプログラムを終了) # # # # 以下プログラムですが実行してもうまくいきません。 # とりあえずどういった感じで作っているか雰囲気だけでも分かってもらえればと思います。 # プログラム :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断), _診断 = 終了. データまたはコマンドの入力(_データまたはコマンド行) :- get_line(_データまたはコマンド行). コマンドループ(_データまたはコマンド行,_診断) :- sub_atom(_データまたはコマンド行,0,1,_,'%'), split(_データまたはコマンド行,['%',' '],[_コマンド|_引数], コマンドの実行(_コマンド,_引数,_診断). コマンドループ(_データまたはコマンド行,_診断) :- \+(sub_atom(_データまたはコマンド行,0,1,_,'%')), データ入力(_データまたはコマンド行,_診断). コマンドループ(_,_診断) :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断). コマンドの実行('Q',_,終了) :- コマンドの実行('C',_,true) :- count(clause(データ(_),_),_登録データ数), writef('登録データ数 = %t\n',[_登録データ数]). コマンドの実行('P',[N],true) :- N < 0, N >= -50, M1 is 100 + N, M2 is 0 - N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行('P',[N],true) :- N >= 0, N =< 100, M1 is 0, M2 is N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行(_,_,false). データ入力(_データ,true) :- findmax(N,データ(N,_),Max), Max2 is Max + 1, assertz(データ(Max2,_データ)),!. データ入力(_データ,true) :- assertz(データ(0,_データ)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/300 # # 上手くいかないので質問させてください。 # ACCESS2007を使っています。 # 年フィールドと月フィールドを用いて「年度」の件数を抽出したいのですが、 # 以下のクエリでは月部分が干渉してか上手く抽出出来ません。 # # 22年4月〜23年3月 といった結果を出したいのですがどうしたらよいでしょうか? # # SELECT 年 FROM Table1 # WHERE (年>21 AND 月>3) AND (年<23 AND 月<4) # # '年フィールドと月フィールドを用いて「年度」の件数を抽出したい'(_テーブル,L) :- テーブル構造(_テーブル,年,M), テーブル構造(_テーブル,月,N), findmax(U,テーブル構造(_テーブル,_,U),Max), length(L1,Max), nth1(M,L1,_年), nth1(N,L1,_月), P =.. [_テーブル|L1], findall(_年度,( P, 年度のルール(_年,_月,_年度)), _年度ならび), findsetof(_年度,( append(_,[_年度|_],_年度ならび), L2), findall([_年度,_度数],( append(_,[_年度|_],L2), count(append(_,[_年度|_],_年度ならび),_度数)), L). 年度のルール(_年,_月,_年度) :- _月 >= 4, _年 = _年度,!. 年度のルール(_年,_月,_年度) :- _月 < 4, _年度 is _年 - 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/288 # # sqlite v3.6.23.1で、 # comment (text) ,postedtime (int) という形式にて掲示板を作っているのですが、 # 「最新の5コメント、但し、24時間以内の投稿については最大50個まで」を求めたくて # # SELECT comment FROM mm ORDER BY postedtime DESC LIMIT 50 # UNION # SELECT comment FROM mm WHERE postedtime > $nowtime - 3600*24 ORDER BY ptime DESC LIMIT 50 # # としてみたのですが($nowtimeには今の時間を入れてます)、 # 1st ORDER BY term does not match in the result set というエラーが出ます。 # (union前後のクエリそれぞれ単独ではエラーは出ません) # # 欲しい結果を求めるにはどのように書けばいいのでしょうか? # # '最新の5コメント、但し、24時間以内の投稿については最大50個まで'(_テーブル,_現在の時刻,P) :- split(_現在の時刻,[' ','/','-',':','.'],[_年,_月,_日,_時,_分,_秒,_]), テーブル構造(_テーブル,時刻,N), findmax(M,テーブル構造(_テーブル,_,M),Max), length(L1,Max), nth1(N,L1,_時刻), P =.. [_テーブル|L1], 選択(P,_年,_月,_日,_時,_分,_秒,L), append(_,[_時刻|_],L), call(P). 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findsetof(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 要素切り取り(L1,L),!. 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findall(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 整列(L1,L2), 要素切り取り(L2,L),!. 選択(P,_,_,_,_,_,_,L) :- findall(_時刻,( call(P)), L1), 整列(L1,L2), length(L,5), append(_,L,L2),!. 要素切り取り(L1,L) :- length(L1,Length), Length >= 50, length(L,50), append(_,L,L1),!. 要素切り取り(L1,L1) :- length(L1,Length), Length >= 5, length < 50,!. 時刻が24時間以内(_年,12,31,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _年_1 is _年 + 1, [_年_1,1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,29,_時,_分,_秒,_時刻) :- うるう年(_年), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,28,_時,_分,_秒,_時刻) :- \+(うるう年(_年)), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,30,_時,_分,_秒,_時刻) :- append(_,[_月|_],[4,6,9,11]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,31,_時,_分,_秒,_時刻) :- append(_,[_月|_],[1,3,5,7,8,10]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _日_1 is _日 + 1, [_年,_月,_日_1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/6 # # よくある質問1 # # (問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # このようなテーブルから、下記のように # # 1 | 2007-11-12 | ggg # 3 | 2007-11-12 | ddd # 2 | 2007-11-11 | bbb # 4 | 2007-11-10 | fff # # 各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。 # # (答) # select A.ID, #     A.DATE, #     A.DATA # from TableName A #    inner join #    (select ID, max(DATE) as MAX_DATE #     from TableName #     group by ID #    ) B #    on A.ID = B.ID #    and A.DATE = B.MAX_DATE # ; # 'TableName'(1,'2007-11-11',aaa). 'TableName'(2,'2007-11-11',bbb). 'TableName'(1,'2007-11-10',ccc). 'TableName'(3,'2007-11-12',ddd). 'TableName'(3,'2007-11-11',eee). 'TableName'(4,'2007-11-10',fff). 'TableName'(1,'2007-11-12',ggg). '各idに対して最新の1件だけ抽出する'(_ID,_DATE,_DATA) :- findsetof(_ID,'TableName'(_ID,_,_),L1), append(_,[_ID|_],L1), findmax([_DATE,_ID,_DATA],( 'TableName'(_ID,_DATE,_DATA)), [_DATE,_ID,_DATA]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/247 # # # 【 課題 】 # ある 3桁の数とそれぞれの桁を逆に並べた 3桁の数を足し合わせ # それが回文数になるまで同じ操作を繰り返したとき # 最も回文数になりにくい 3桁の数を見つけてください 'ある 3桁の数とそれぞれの桁を逆に並べた 3桁の数を足し合わせそれが回文数になるまで同じ操作を繰り返したとき最も回文数になりにくい 3桁の数を見つけてください'(_最も回文数になりにくい3桁の数) :- findmax([_回文数になるまでの繰り返し回数,_ある3桁の数ならび],( 'ある 3桁の数'(_ある3桁の数), 回文数になるまで繰り返す([],_ある3桁の数,_回文数になるまでの繰り返し回数)), [_回文数になるまでの繰り返し回数,_最も回文数になりにくい3桁の数]),!. 回文数になるまで繰り返す(Ln,N_回文数になるまでの繰り返し回数) :- reverse_integer(N1,N2), \+(N1=N2), N3 is N1 + N2, 回文数になるまで繰り返す([_|Ln],N3,_回文数になるまでの繰り返し回数),!. 回文数になるまで繰り返す(Ln,N,_回文数になるまでの繰り返し回数) :- length(Ln,_回文数になるまでの繰り返し回数),!. reverse_integer(N1,N2) :- integer_integers(N1,NL1), reverse(NL1,NL2), integer_integers(N2,NL2),!. integer_integers(N,L) :- integer(N), number_codes(N,Codes), findall(M,( append(_,[M1|_],Codes), M is M1 - 48), L),!. integer_integers(N,L) :- var(N), findall(Code,( append(_,[M|_],L), Code is M + 48), L1), number_codes(N,L1),!. ある3桁の数(_ある3桁の数) :- for(100,_ある3桁の数,999). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/247 # # # 【 課題 】 # ある 3桁の数とそれぞれの桁を逆に並べた 3桁の数を足し合わせ # それが回文数になるまで同じ操作を繰り返したとき # 最も回文数になりにくい 3桁の数を見つけてください 'ある 3桁の数とそれぞれの桁を逆に並べた 3桁の数を足し合わせそれが回文数になるまで同じ操作を繰り返したとき最も回文数になりにくい 3桁の数を見つけてください'(_最も回文数になりにくい3桁の数) :- findmax([_回文数になるまでの繰り返し回数,_ある3桁の数ならび],( 'ある 3桁の数'(_ある3桁の数ならび), reverse(_ある3桁の数ならび,_反転したある3桁の数ならび), 回文数になるまで繰り返す([],_ある3桁の数ならび,_反転したある3桁の数ならび,_回文数になるまでの繰り返し回数)), [_回文数になるまでの繰り返し回数,_最も回文数になりにくい3桁の数ならび]), number_chars(_最も回文数になりにくい3桁の数,_最も回文数になりにくい3桁の数ならび),!. 回文数になるまで繰り返す(Ln,L,L,_回文数になるまでの繰り返し回数) :- length(Ln,_回文数になるまでの繰り返し回数),!. 回文数になるまで繰り返す(Ln,L1,L2,_回文数になるまでの繰り返し回数) :- number_chars(N1,L1), number_chars(N2,L2), N3 is N1 + N2, number_chars(N3,L3), reverse(L3,L4), 回文数になるまで繰り返す([_|Ln],L3,L4,_回文数になるまでの繰り返し回数),!. 'ある 3桁の数'([A1,A2,A3]) :- member(A1,['0','1','2','3','4','5','6','7','8','9']), member(A2,['0','1','2','3','4','5','6','7','8','9']), member(A3,['0','1','2','3','4','5','6','7','8','9']). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'ある 3桁の数とそれぞれの桁を逆に並べた 3桁の数を足し合わせそれが回文数になるまで同じ操作を繰り返したとき最も回文数になりにくい 3桁の数を見つけてください'(_最も回文数になりにくい3桁の数) :- findmax([_回文数になるまでの繰り返し回数,_ある3桁の数ならび],( 'ある 3桁の数'(_ある3桁の数), 回文数になるまで繰り返す([],_ある3桁の数,_回文数になるまでの繰り返し回数)), [_回文数になるまでの繰り返し回数,_最も回文数になりにくい3桁の数]),!. 回文数になるまで繰り返す(Ln,N_回文数になるまでの繰り返し回数) :- reverse_integer(N1,N2), \+(N1=N2), N3 is N1 + N2, 回文数になるまで繰り返す([_|Ln],N3,_回文数になるまでの繰り返し回数),!. 回文数になるまで繰り返す(Ln,N,_回文数になるまでの繰り返し回数) :- length(Ln,_回文数になるまでの繰り返し回数),!. reverse_integer(N1,N2) :- integer_integers(N1,NL1), reverse(NL1,NL2), integer_integers(N2,NL2),!. integer_integers(N,L) :- integer(N), number_codes(N,Codes), findall(M,( append(_,[M1|_],Codes), M is M1 - 48), L),!. integer_integers(N,L) :- var(N), findall(Code,( append(_,[M|_],L), Code is M + 48), L1), number_codes(N,L1),!. ある3桁の数(_ある3桁の数) :- for(100,_ある3桁の数,999). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/610 # # [1] 授業単元: プログラミング # [2] 問題文 サッカーの試合結果の記録されたデータファイルを読み取り、 # 優勝したチーム名を出力するプログラムを作成せよ。 # データファイルには、先頭の行にチーム数が出力されており、 # 2行目からチーム名(チーム数分)、 # それ以降の行に試合結果が出力されている。 # 試合結果の行は以下のフォーマットとなっている。 # <ホーム側のチーム名> <ホーム側チームの得点> # <アウェイ側チームの得点> <アウェイ側チーム名> # チーム名は30文字以内とする。 # 試合に勝ったチームには勝ち点3が与えられ、引き分けたチームには # 勝ち点1が与えられる。勝ち点の合計が最も多いチームが優勝となるが、 # 勝ち点の合計が同じチームが複数ある場合には、それらのうち、 # 得失点差(得点と失点の差)の合計が大きいチームが優勝となる。 # 得失点差の合計が同じ場合にはどちらを優勝としてもよい。 # 4 # MANCHESTER_UNITED # ARSENAL # CHELSEA # LIVERPOOL # MANCHESTER_UNITED 3 1 ARSENAL # CHELSEA 3 0 LIVERPOOL # ARSENAL 2 2 CHELSEA # LIVERPOOL 3 0 MANCHESTER_UNITED # ------------------------------------ # 優勝したチーム名を出力するプログラムを作成する(_データファイル) :- get_lines(_データファイル,Lines), データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび), '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび), 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム), 出力する(_優勝したチーム名). データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび) :- Lines = [_チーム数文字列|_2行目以降ならび], atom_to_term(_チーム数文字列,_チーム数,_),!. '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび) :- length(_チーム名ならび,_チーム数), append(_チーム名ならび,_試合結果ならび,_2行目以降ならび),!. 優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム名) :- findall([_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],( append(_,[_チーム名|_],_チーム名ならび), all([_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],0)), _チーム成績ならび), 試合結果をチーム成績ならびに反映させる(_試合結果ならび,_チーム成績ならび,_最終チーム成績ならび), 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名). 試合結果をチーム成績ならびに反映させる([],_最終チーム成績ならび,_最終チーム成績ならび) :- !. 試合結果をチーム成績ならびに反映させる([_試合結果行|R],_チーム成績ならび1,_最終チーム成績ならび) :- split(_試合結果行,[' '],[_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名]), 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,_ホーム側の勝数の加算値,_アウェイ側の勝数の加算値,_ホーム側の敗数の加算値,_アウェイ側の敗数の加算値,_ホーム側の引き分け数の加算値,_アウェイ側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_アウェイ側の勝ち数の加算値), チーム成績の更新(_ホーム側のチーム名,_ホーム側の得点,_ホーム側の勝数の加算値,_ホーム側の敗数の加算値,_ホーム側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_チーム成績ならび1,_チーム成績ならび2), チーム成績の更新(_アウェイ側のチーム名,_アウェイ側の得点,_アウェイ側の勝数の加算値,_アウェイ側の敗数の加算値,_アウェイ側の引き分け数の加算値,_アウェイ側の勝ち点の加算値,_チーム成績ならび2,_チーム成績ならび3), 試合結果をチーム成績ならびに反映させる(R,_チーム成績ならび3,_最終チーム成績ならび). 優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名) :- findmax([_勝ち点,_得失点差],( append(_,[[_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差]|_],_最終チーム成績ならび)), [_勝ち点,_得失点差]), append(_,[[_優勝したチーム名,_,_,_,_勝ち点,_,_,_得失点差]|_],_最終チーム成績ならび). 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,1,0,0,1,0,0,3,0) :- _ホーム側の得点 > _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,1,1,0,0,0,0,3) :- _ホーム側の得点 < _アウェイ側の得点,!. 勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,0,0,0,1,1,1,1) :- _ホーム側の得点 = _アウェイ側の得点,!. 出力する(_優勝したチーム名) :- write_formatted('優勝したチームは %t です\n',[_優勝したチーム名]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/351 # # [1] 授業単元:課題 # [2] 問題文:単方向リスト # typedef struct list # { # char name[20]; // 名前 # char tel[20]; // 電話番号 # struct list *next; // 次のデータを指す構造体ポインタ # } # # グローバル変数とダミーノードを使わない。追加、削除、全体表示の動作を行う # ことができる住所録のプログラムをよろしくお長いします 住所録追加(_名前,_電話番号) :- assertz(住所録(_名前,_電話番号)). 住所録削除(_名前,_電話番号) :- retract(住所録(_名前,_電話番号)), fail. 住所録削除(_,_). 住所録全体表示 :- 名前の最大長(_名前の最大長), 電話番号の最大長(_電話番号の最大長), concat_atom(['%',_名前の最大長,'s | ','%',_電話番号の最大長,s],_表示形式), write_formatted(_表示形式,[名前,電話番号]), clause(住所録(_名前,_電話番号),_), write_formatted(_表示形式,[_名前,_電話番号]), fail. 住所録全体表示. 住所録の保存 :- tell('住所録#2.pro'), listing(住所録/2), told. 住所録の準備 :- retract('住所録#2.pro'). 名前の最大長(_名前の最大長) :- findmax(_名前の長さ,( clause(住所録(_名前,_), sub_atom(_名前,0,_長さ,0,_名前)), _名前の最大長). 電話番号の最大長(_電話番号の最大長) :- findmax(_電話番号の長さ,( clause(住所録(_,_電話番号), sub_atom(_電話番号,0,_長さ,0,_電話番号)), _電話番号の最大長). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/778 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n本の棒がある。棒i(3<n<100)の長さはa_i(1<a_i<10^4)である。 # あなたは、それらの棒から3本を選び、「できるだけ周長の長い三角形」と「できるだけ周長の短い三角形」 # を作ろうと考えている。それぞれ最大・最短の周長と選択した棒の組を求めるプログラムを作成せよ。 # ただし、どのような棒の組を選んでも三角形が作れない場合、0を答えとして返せ。 # プログラムの要件として、以下の事項を定める。 # ・引数として棒の長さデータが収められたファイル名のみが与えられるものとする。 # ・結果として、標準出力に、最大周長と棒の組み合わせ、最短周長と棒の組み合わせが出力されること。 # # % cat length.dat # 2 3 4 5 10 # % ./a.out length.dat # 最大周長=12 (3 4 5) # 最短周長=9 (2 3 4) # # %cat length.dat # 4 5 10 20 # % ./a.out length.dat # 0 # program :- user_parameters([_ファイル名]), get_lines(_ファイル名,Lines), findall(N,( append(_,[Line|_],Lines), sqlit(Line,[' '],L2), append(_,[N|_],L2)), _棒の長さならび), 周囲が最大の三角形(_棒の長さならび,[A1,B1,C1]), 周囲が最短の三角形(_棒の長さならび,[A2,B2,C2]), write_formatted('最大周長=%t (%t %t %t)\n',[_最大周長,A1,B1,C1]), write_formatted('最短周長=%t (%t %t %t)\n',[_最短周長,A2,B2,C2]). fail. program. 周囲が最大の三角形(_棒の長さならび,[A,B,C],_最大周長) :- 最大周長を得る(_棒の長さならび,_最大周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最大周長を得る(_棒の長さならび,_最大周長) :- findmax(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最大周長),!. 周囲が最短の三角形(_棒の長さならび,[A,B,C]) :- 最短周長を得る(_棒の長さならび,_最短周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最短周長を得る(_棒の長さならび,_最短周長) :- findmin(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最短周囲). 周長から三辺を得る(_棒の長さならび,_周長,A,B,C) :- 組み合わせ(組み合わせ(_棒の長さならび,3,[A,B,C]), 組み合わせ(_棒の長さならび,3,[A,B,C]), _周長 is A + B + C, C > A + B, B > A + C, A > B + C. % 以下のサイトは 和暦西暦変換(_和暦,_西暦) :- integer(_西暦), findmax([_最終年,_元年,_年間],( 年間(_年間,_元年,_最終年), _最終年 =< _西暦), [_最終年,_元年,_年間]), _年 is _西暦 - _元年 + 1, 和暦年表示(_年間,_年,_和暦),!. 和暦西暦変換(_和暦,_西暦) :- atom(_和暦), 年間(_年間,_元年,_最終年), sub_atom(_和暦,0,Len,R1,_年間), sub_atom(_和暦,Len,_,0,_和暦年), 和暦の年抽出(_和暦年,_年間,_年), _西暦 is _元年 + _年 - 1,!. 年間(慶応,1865,1868). 年間(明治,1868,1912). 年間(大正,1912,1926). 年間(昭和,1926,1989). 年間(平成,1989,2011). 和暦年表示(_年間,_年,_和暦年) :- _年 =< 10, list_nth(_年,[元,二,三,四,五,六,七,八,九,十],A), concat_atom([_年間,A,年],_和暦年),!. 和暦年表示(_年間,_年,_和暦年) :- _年 >= 11, Div is _年 // 10, Mod is (_年 mod 10) + 1, list_nth(Div,['',二,三,四,五,六,七,八,九],A), list_nth(Mod,['',一,二,三,四,五,六,七,八,九],B), concat_atom([_年間,A,十,B,年],_和暦年),!. 和暦の年抽出(_和暦年,_年間,_年) :- sub_atom(_和暦年,_,_,_,_年間,S2,年,L1,L2,L3), 年間(_年間,_元年,_最終年), 漢数字アラビア数字対応(L2,_年). 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応(元,1). 漢数字アラビア数字対応(一,1). 漢数字アラビア数字対応(二,2). 漢数字アラビア数字対応(三,3). 漢数字アラビア数字対応(四,4). 漢数字アラビア数字対応(五,5). 漢数字アラビア数字対応(六,6). 漢数字アラビア数字対応(七,7). 漢数字アラビア数字対応(八,8). 漢数字アラビア数字対応(九,9). 和数字アラビア数字対応([A,十,B],N) :- 和数字アラビア数字対応(A,N1), 和数字アラビア数字対応(B,N2), N is N1 * 10 + N2,!. 和数字アラビア数字対応([A,十],N) :- 和数字アラビア数字対応(A,N1), N is N1 * 10,!. 和数字アラビア数字対応([十,B],N) :- 和数字アラビア数字対応(B,N2), N is 10 + N2,!. 和数字アラビア数字対応([十],10) :- !. 和数字アラビア数字対応([A],N) :- 和数字アラビア数字対応(A,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/730 # # ・DBMS名とバージョン #  MySQL 5.1 # ・テーブルデータ #  記録ID(通し番号)、ユーザID、日時、金額、購入品目ID # ・欲しい結果 #  購入品目ID、日時(最新の1件)、金額(〃)  //ただしユーザID=A # # ・説明 #  ユーザID=Aの、購入品目IDごとに、最新の日時と金額を表示させたいです。 #  (購入品目IDが1〜10まであったら、10行の結果が返ってくるような) #  どこに副問合せを使っていいか分からず詰まりました。どなたかお願いします。 # # 'ユーザID=Aの、購入品目IDごとに、最新の日時と金額を表示させたいです。' :- 'ユーザIDを指定して、購入品目IDごとに、最新の日時と金額を表示'('A'). 'ユーザIDを指定して、購入品目IDごとに、最新の日時と金額を表示'(_ユーザID) :- findsetof(_購入品目ID, テーブルデータ(_記録ID,_ユーザID,_日時,_金額,_購入品目ID), L1), append(_,[_購入品目ID|R],L1), findmax([_日時,_その日の合計金額], findsum(_金額,( テーブルデータ(_記録ID,_ユーザID,_日時,_金額,_購入品目ID)), _その日の合計金額), [_日時,_その日の合計金額]), write_formatted('%t,%t,%t\n',[_ユーザID,_日時,_その日の金額]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/523 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/www.dotup.org/uploda/www.dotup.org1299227.jpg.html # テーブル構造(英語と数学の得点データ,1,受験者番号). テーブル構造(英語と数学の得点データ,2,英語). テーブル構造(英語と数学の得点データ,3,数学). 英語と数学の得点データ(0,50,10). 英語と数学の得点データ(1,60,80). 英語と数学の得点データ(2,80,80). 英語と数学の得点データ(3,10,90). 英語と数学の得点データ(4,90,90). 英語と数学の得点データ(5,20,30). 二科目合計の最高得点と120点未満の受験者番号を表示する( 二科目合計の最高得点と(_二科目合計の最高得点), '120点未満の受験者番号を'(_120点未満の受験者番号ならび), 表示する(_二科目合計の最高得点,_120点未満の受験者番号). 二科目合計の最高得点と(_二科目合計の最高得点) :- findmax(_二科目合計,( 英語と数学の得点データ(_受験者番号,_英語,_数学), _二科目合計 is _英語 + _数学), _二科目合計の最高得点). '120点未満の受験者番号を'(_120点未満の受験者番号ならび) :- findall(_120点未満の受験者番号,( 英語と数学の得点データ(_120点未満の受験者番号,_英語,_数学), 120 < _英語 + _数学), _120点未満の受験者番号ならび). 表示する(_二科目合計の最高得点,_120点未満の受験者番号) :- concat_atom(_120点未満の受験者番号,' ',_120点未満の受験者番号表示), write_formatted('二科目合計の最高得点は %t 点です\n120点未満の受験者番号は %t です\n',[_二科目合計の最高得点,_120点未満の受験者番号表示]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/669 # # MySql 5.1 です。 # select句の subquery で、カラムを2つ返したいのですが、 # これは不可能なのでしょうか? # 何か良い方法はないでしょうか? # # 同じ問い合わせを、2回書くのは なしということでお願いします。 # こんな感じで実現できたらベストです。 # # select # a.name , # b.date , # ( # select # c.foo_id, # c.bar_id # from # c # where # a.cond = c.cond # and b.date > c.date # order by c.date desc # limit 1 # ) # from # a, b # where # a.id = b.id # # # aTable # --------- # id,cond,name # # bTable # -------- # id,date # # cTable # ---------- # foo_id,bar_id,cond,date 'select句の subquery で、カラムを2つ返したい'(_name,_date,_foo_id,_bar_id) :- a(_id,_cond,_name), b(_id,_date), findmax([_date,_foo_id,_bar_id],( c(_foo_id,_bar_id,_cond,_c_date), _date > _c_date), [Max_date,_foo_id,_bar_id]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/650 # # SQLite3で # # 1 | aaa # 2 | bbb # 3 | ccc # 4 | ddd # 5 | eee # # というテーブルから「3 ccc」を削除した時に自動で # # 1 | aaa # 2 | bbb # 3 | ddd # 4 | eee # # みたいに修正する方法ってありますか? # 他のDBMSでの方法でも構わないので宜しくお願いします。 # '節が削除された時、連続したidを自動で振り直す'(_テーブル名,_削除された順idならび) :- '節が削除された時idを自動で振り直す'(_テーブル名,_削除された順idならび,0),!. '節が削除された時idを自動で振り直す'(_テーブル名,[_id1],Sub1) :- findall(_,テーブル構造(_テーブル名,_,_),L), 最終節のidを得る(_テーブル名,L,Max), テーブル構造の生成(_テーブル名,L,_id_d,_id_a,P,Q), _id1_1 is _id1 + 1, '_id1と_id2にの間の節のidを振り直す'(_id1_1,Max,id_d,P,_id_a,Q,Sub1),!. '節が削除された時idを自動で振り直す'(_テーブル名,[_id1,_id2|R],Sub1) :- findall(_,テーブル構造(_テーブル名,_,_),L), idを更新する節の現在のid範囲(_id1,_id2,_id_1,_id2_1), テーブル構造の生成(_テーブル名,L,_id_d,_id_a,P,Q), '_id1と_id2にの間の節のidを振り直す'(_id1_1,_id2_1,id_d,P,_id_a,Q,Sub1), Sub2 is Sub1 + 1, '節が削除された時idを自動で振り直す'(_テーブル名,[_id2|R],Sub2). 最終節のidを得る(_テーブル名,L,Max) :- L = [_id|R], P =.. [_テーブル名|L], findmax(_id,call(P),Max),!. '_id1と_id2にの間の節のidを振り直す'(_id1,_id2,_id_d,P,_id_a,Q,Sub1) :- for(_id1,N,_id2), retract(P), _id_a is _id_d - Sub1, assertz(Q), N = _id2,!. テーブル構造の生成(_テーブル名,L,_id_d,_id_a,P,Q) :- L = [_|R], P =.. [_テーブル名,_id_d|R], Q =.. [_テーブル名,_id_a|R],!. idを更新する節の現在のid範囲(_id1,_id2,_id_1,_id2_1) :- _id1_1 is _id1 + 1, _id2_1 is _id2 - 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/635 # # 宜しくお願いします。 # # ・DBMS名とバージョン # Oracle10g # # ・テーブルデータ # SALES # +------------+------+ # | 日時 | 数量 | # +------------+------+ # | 2010/03/01 | 1 | # | 2010/03/02 | 1 | # | 2010/03/23 | 2 | # | 2010/03/24 | 1 | # | 2010/04/05 | 5 | # | 2010/04/05 | 2 | # +------------+------+ # # ・欲しい結果 # テーブルから週毎(月曜基準)に合算した数量を取得したい。 # 但しデータがない週も0で表示したい。 # # ・説明 # 週毎に合算した数量は以下のSQLで取得できましたが、 # データがない週も表示する方法がわかりません。 # # SELECT NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7 AS 日時, SUM(数量) # FROM SALES # GROUP BY NEXT_DAY(TO_DATE(日時,'yyyy/mm/dd'),2)-7; # # 宜しくお願い致します。 'テーブルから週毎(月曜基準)に合算した数量を取得したい。但しデータがない週も0で表示したい。'(_週区間下限,_週区間上限,_数量合計) :- 週グループを生成(_週区間ならび), 週区間ごとに数量を合計する(_週区間ならび,_週合計ならび), append(_,[[_週区間下限,_週区間上限,_数量合計]|R],_集合計ならび). 週グループを生成(_週区間ならび) :- findmin(_日時,'SALES'(_日時,_),_日付下限), findmax(_日時,'SALES'(_日時,_),_日付上限), 最も直前の月曜日(_日付下限,_日付下限の一), 最も直前の月曜日(_日付上限,_日付上限の一), findall([_月曜日,_直後の日曜日],( 週の切り取り(_日付下限の一,_月曜日,_日付上限の一), 直後の日曜日(_月曜日,_直後の日曜日)), _週区間ならび), length(_週区間ならび,Len),!. 週区間ごとに数量を合計する([],[]) :- !. 週区間ごとに数量を合計する([[_週区間下限,_週区間上限]|R1],[[_週区間下限,_週区間上限,_数量合計]|R2]) :- findsum(_数量,( 'SALES'(_日時,_数量),_数量合計), _日時 @>= _週区間下限, _日時 @=< _週区間上限), _数量合計), 週区間ごとに数量を合計する(R1,R2). 週の切り取り(_月曜日,_月曜日,_日付上限) :- _月曜日 @=< _日付上限. 週の切り取り(_月曜日の一,_月曜日,_日付上限) :- 直後の月曜日(_月曜日の一,_直後の月曜日), 週の切り取り(_直後の月曜日,_月曜日,_日付上限). % 以下のサイトは # 三角形 # n本の棒があります。棒iの長さはaiです。あなたは、それらの棒から3本選んでできるだけ # 周長の長い三角形を作ろうと考えています。最大の周長を求めなさい。ただし、三角形が # 作れない際には0を答えとしなさい。 'n本の棒があります。棒iの長さはaiです。あなたは、それらの棒から3本選んでできるだけ周長の長い三角形を作ろうと考えています。最大の周長を求めなさい。ただし、三角形が作れない際には0を答えとしなさい。'(_棒の長さならび,_最大の周長) :- findmax(_周長,( 組合せ(_棒の長さならび,3,[_辺の一,_辺の二,_辺の三]), 三角形を構成できる(_辺の一,_辺の二,_辺の三), sum(L,_周長)), _最大の周長). 三角形を構成できる(_辺の一,_辺の二,_辺の三) :- _辺の一 < _辺の二 + _辺の三, _辺の二 < _辺の一 + _辺の三, _辺の三 < _辺の一 + _辺の二. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/627 # # mysql 5.0 (windows 7)です # 下記のようなテーブルで # amountの合計の最も多いidを取得するsql文がわかりません… # # select id, sum(amount) as "total" from orders # group by id order by total desc limit 1; # # とすれば一応取得できたのですが、別の方法はないでしょうか # 初歩的な質問ですみません… # # +------+------+--------+ # | id | name | amount | # +------+------+--------+ # | 1 | C1 | 3 | # | 1 | C2 | 10 | # | 2 | C2 | 5 | # | 2 | C3 | 10 | # | 3 | C3 | 2 | # +------+------+--------+ # 'amountの合計の最も多いidを取得する'(_最もaumout合計が多いid) :- find_sum_max([_id,_値],orders(_id,_,_値),[_最もamount合計が多いid,_最大合計値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % _合計値 は任意の変数として、利用者が設定する find_sum_max([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最小合計値), append(_,[[_鍵,_最小合計値]|_],L). find_sum_max([_鍵,_値],P,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,append(_,[[_鍵,_合計値]|_],L),_最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,append(_,[[_鍵,_合計値]|_],L),_最小合計値), append(_,[[_鍵,_最小合計値]|_],L). 単一(A,P) :- findsetof(A,P,L),!, append(_,[A|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/544 # # (3)関数f(x)の最大値と最大値となる場合のxの値を求め、表示しなさい。 #     f(x)=x2乗-3x+4 # ただし、xは0.0001刻みとし、範囲は-10<=x<=10とする # # (4)掛け算九九の票を作成する。 #   ・出力例 #    1 2 3 4 5 6 7 8 9 # 2................ # 3................ # 4................ # 5................ # 6................ # 7................ # 8................ # 9................ #  ・指定 # for文を用いた2重ループを使い、九九の各値は計算式で求める。表示桁数を調整して見栄映えよく出力すること。 #    # # '関数f(x)の最大値と最大値となる場合のxの値を求め、表示しなさい。 f(x)=x2乗-3x+4 ただし、xは0.0001刻みとし、範囲は-10<=x=<10とする' :- '関数f(x)の最大値と最大値となる場合のxの値を求め'(_最大値,_最大値の時のX), write_formatted('最大値は %t, その時のxの値は %t です\n',[_最大値,_最大値の時のX]). '関数f(x)の最大値と最大値となる場合のxの値を求め'(_最大値,_最大値の時のX) :- findmax([Y,X],( for(-100000,N,100000), X is N / 10000, Y is X ^ 2 - 3 * X + 4), [_最大値,_最大値の時のX]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/863 # # [1] 授業単元:自然言語処理 # [2] 問題文(含コード&リンク): # ttp://nlp.dse.ibaraki.ac.jp/~shinnou/lecture/nl/rep1.pdf # 課題2のみです。 # 課題2 次の図はループのない有向グラフである。辺の向きは記載されていないが、左から右である。 # V9 ! V12 とV13 ! V3 に注意すること。 # V0 をStart ノード、V6 をEnd ノードとして、V0 からV6 に至るパスのうちで、重みの和が # 最大となるようなパスをViterbi アルゴリズムにより求めるプログラムをC あるいはJava # で作成せよ。 # ただしグラフは、入力する形でなくても、プログラムの中で予め配列などで作成しておく形 # でもよい。 # > kadai2.exe # 重みが最大のパスは # V0 --> V* --> V* ・・・・--> V6 # 重みの和は*** # 有向グラフ('V0','V1',1). # 有向グラフ('V1','V2',2). # 有向グラフ('V2','V3',5). # 有向グラフ('V3','V4',8). # 有向グラフ('V4','V5',2). # 有向グラフ('V5','V6',1). # 有向グラフ('V7','V6',2). # 有向グラフ('V8','V7',1). # 有向グラフ('V9','V8',5). # 有向グラフ('V10','V9',2). # 有向グラフ('V10','V11',6). # 有向グラフ('V11','V12',5). # 有向グラフ('V12','V13',1). # 有向グラフ('V0','V10',3). # 有向グラフ('V1','V11',1). # 有向グラフ('V2','V12',4). # 有向グラフ('V8','V5',6). # 有向グラフ('V9','V12',7). # 有向グラフ('V9','V13',1). # 有向グラフ('V11','V9',3). # 有向グラフ('V12','V3',8). # 有向グラフ('V12','V5',2). # 有向グラフ('V13','V8',3). # 有向グラフ('V13','V3',1). # # グラフのデータ構造の例、0 が辺なし、‐の値は向きが逆、+の値は向きが正しい重み。 # #include # #define N 14 /* 頂点の数*/ # #define START 0 /* 始点の頂点番号*/ # #define END 6 /* 終点の頂点番号*/ # int g[N][N] = { /* グラフG はN 行N 列の配列*/ # /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ # { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0}, # { -1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, # { 0, -2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0}, # { 0, 0, -5, 0, 8, 0, 0, 0, 0, 0, 0, 0, -8, -1}, # { 0, 0, 0, -8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, # { 0, 0, 0, 0, -2, 0, 1, 0, -6, 0, 0, 0, -2, 0}, # { 0, 0, 0, 0, 0, -1, 0, -2, 0, 0, 0, 0, 0, 0}, # { 0, 0, 0, 0, 0, 0, 2, 0, -1, 0, 0, 0, 0, 0}, # { 0, 0, 0, 0, 0, 6, 0, 1, 0, -5, 0, 0, 0, -3}, # { 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, -2, -3, 7, 1}, # { -3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 0, 0}, # { 0, -1, 0, 0, 0, 0, 0, 0, 0, 3, -6, 0, 5, 0}, # { 0, 0, -4, 8, 0, 2, 0, 0, 0, -7, 0, -5, 0, 1}, # { 0, 0, 0, 1, 0, 0, 0, 0, 3, -1, 0, 0, -1, 0} # }; # ・・・・ 有向グラフ('V0','V1',1). 有向グラフ('V1','V2',2). 有向グラフ('V2','V3',5). 有向グラフ('V3','V4',8). 有向グラフ('V4','V5',2). 有向グラフ('V5','V6',1). 有向グラフ('V7','V6',2). 有向グラフ('V8','V7',1). 有向グラフ('V9','V8',5). 有向グラフ('V10','V9',2). 有向グラフ('V10','V11',6). 有向グラフ('V11','V12',5). 有向グラフ('V12','V13',1). 有向グラフ('V0','V10',3). 有向グラフ('V1','V11',1). 有向グラフ('V2','V12',4). 有向グラフ('V8','V5',6). 有向グラフ('V9','V12',7). 有向グラフ('V9','V13',1). 有向グラフ('V11','V9',3). 有向グラフ('V12','V3',8). 有向グラフ('V12','V5',2). 有向グラフ('V13','V8',3). 有向グラフ('V13','V3',1). 'V0 をStart ノード、V6 をEnd ノードとして、V0 からV6 に至るパスのうちで、重みの和が最大となるようなパスを求める'(_最大の重みの和,_バス) :- findmax(_重みの和,到達('V0','V6',_重みの和,_パス),_最大の重みの和), 到達('V0','V6',_最大の重みの和,_パス). 到達(_節,_隣接節,_重み,[_節,_隣接節]) :- 有向グラフ(_節,_隣接節,_重み). 到達(_開始節,_到達節,_重みの和,[_開始節|_隣接節から到達節までのパス]) :- 有向グラフ(_開始節,_隣接節,_重み), 到達(_隣接節,_到達節,_隣接節から到達節までの重みの和,_隣接節から到達節までのパス), _重みの和 is _重み + _隣接節から到達節までの重みの和. % findmax/3 % 以下のサイトは # 左横書き文書を右縦書き文書に変換してください # 左横書き文書を右縦書き文書に変換(_横書きの行ならび,_縦書きに置換された行ならび) :- 行の最大長まで空白を付加した文字ならびのならびを作る(_横書きの行ならび,_文字ならびのならび), 転置(_文字ならびのならび,_縦書き用に転置された文字ならびのならび), 右書き用に反転して文字列に戻す(_縦書き用に転置された文字ならびのならび,_縦書きに置換された行ならび),!. 行の最大長まで空白を付加した文字ならびのならびを作る(_横書きの行ならび,_文字ならびのならび) :- 行の最大長を得る(_行の最大長), findall(Chars_2,( append(_,[_行|_],_横書きの行ならび), atom_chars(_行,Chars_1), 空白を付加して文字数を揃える(_行の最大長,Chars_1,Chars_2)), _文字ならびのならび). 行の最大長を得る(_行の最大長) :- findmax(_長さ,( append(_,[_行|_],_横書きの行ならび), sub_atom(_行,0,_長さ,0,_行)), _行の最大長). 空白文字を付加して文字数を揃える(_文字の最大長,_文字ならび,_空白を付加された文字ならび) :- length(_空白を付加された文字ならび,_文字の最大長), append(_文字ならび,_付加するならび,_空白を付加された文字ならび), all(_付加するならび,' '). 右書き用に反転して文字列に戻す([],[]) :- !. 右書き用に反転して文字列に戻す([L1|R1],[S|R2]) :- reverse(L1,L2), atomic_list_concat(L2,S), 右書き用に反転して文字列に戻す(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/508 # # http://www.dotup.org/uploda/www.dotup.org1202425.jpg # # ItemTable # ItemID,ItemName,Price,Maker # -------------------------------------- # '0001','Red bollpen',150,'Four Diamond' # '0002','Sharp pen',250,'Four Diamond' # '0003','Metal ruler',200,'Pantel' # '0004','Eraser',100,'Four Diamond' # '0005','Pencil box',150,'Pantel' # # 対応するPrologコードを書きなさい。 # % テーブル構造(関係名,_属性番号,_属性名,_属性名の変数文字列表現). テーブル構造('ItemTable',1,'ItemID','ItemID'). テーブル構造('ItemTable',2,'ItemName','ItemName'). テーブル構造('ItemTable',3,'Price','Price'). テーブル構造('ItemTable',4,'Maker','Maker'). 'ItemTable'('0001','Red bollpen',150,'Four Diamond'). 'ItemTable'('0002','Sharp pen',250,'Four Diamond'). 'ItemTable'('0003','Metal ruler',200,'Pantel'). 'ItemTable'('0004','Eraser',100,'Four Diamond'). 'ItemTable'('0005','Pencil box',150,'Pantel'). # Q1. # SELECT MIN(Price) AS Result FROM ItemTable; 'Q1'(Result) :- findmin(Price,'ItemTable'(_,_,Price,_),MIN_Price). # Q2. # SELECT ItemName,Price FROM ItemTable WHERE Price >= 250; 'Q2'(ItemName,Price) :- 'ItemTable'(_,ItemName,Price,_), Price >= 250. # Q3. # SELECT MAX(Price) FROM ItemTable WHERE Maker = 'Pantel'; 'Q3'(MAX_Price) :- findmax(Price,'ItemTable'(_,_,Price,_),MAX_Price). # Q4. # SELECT MIN(Price) FROM ItemTable WHERE Price > (SELECT MIN(Price) FROM ItemTable); 'Q4'(Min_Price) :- findmin(Price,'ItemTable'(_,_,Price,_),MIN_Price1), findmin(Price,( 'ItemTable'(_,_,Price,_),Price > MIN_Price1)), MIN_Price). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/500 # # No-色 # レコード1 001,赤 # レコード2 002,赤 # レコード3 003,青 # レコード4 004,青 # レコード5, 005,赤 # レコード6, 006,黒 # # このデータで、 『select 色,count(色 from テーブル group by 色 』とした時 # 最大レコード数(この場合、赤の5)を取得したいのですが・・・ # 定義された節数のもっとも多い色は(_色,_度数) :- findsetof(_色,テーブル(_No,_色),L1), findall([_度数,_色],( member(_色,L1), count(テーブル(_,_色),度数)), L2), findmax(_度数,member([_度数,_],L2),_最大度数), append(_,[[_度数,_色]|R],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1280653311/570 # # [1] 授業単元:応用C言語 # [2] 問題文(含コード&リンク): # 標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換 # して標準出力するプログラムを作成せよ。 # ただし最後の引数の文字列が現れた場合は最初に指定された文字列に # 置換するものとする。 # また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が # 現れたものと解釈する。 # # *入力文字に非ASCII文字が含まれないとして良い # '標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して標準出力する。ただし最後の引数の文字列が現れた場合は最初に最初に指定された文字列に置換するものとする。また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が現れたものと解釈する。' :- user_parameters(_指定文字列ならび), _指定文字列ならび = [A|R1], append(_指定文字列ならび,[A],_指定文字列ならびの二), 置換述語の生成(_指定文字列ならびの二), '標準入力を読み込み'(Chars), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars,Chars2), put_chars(Chars2). 置換述語の生成([_]) :- !. 置換述語の生成([_文字列1,_文字列2|R]) :- atom_chars(_文字列1,Chars1), atom_chars(_文字列2,Chars2), atom_length(_文字列1,Len), append(_文字列1,R1,L1), append(_文字列2,R2,L2), assertz((置換述語(L1,R1,Len,L2,R2))), 置換述語の生成([_文字列2|R]). 標準入力を読み込み(Chars) :- get_chars(Chars). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars1,Chars2x) :- findmax([Len,R1,Char2,R2],置換述語(Chars1,R1,Len,Char2,R2),[Lenx,R1x,Char2x,R2x]), '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1x,R2x). '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'([A|R1],[A|R2]) :- '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1,R2). 標準出力する(Chars) :- concat_atom(Chars,Atom), write(Atom). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/621 # # 【 課題 】3問ありますのでアップローダに投稿させていただきました。 # http://ime.nu/www.dotup.org/uploda/www.dotup.org473124.zip # # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】12/23 # 【 Ver  】1.6.0_16 # 【 補足 】課題文にいくつかの指定がありますのでその通りでお願いします。 # 宜しくお願いします。 # # 0から360までの整数をランダムに10個発生させ、その整数を角度(弧度法)と # みなしたとき、その(sin)が最大となる整数を表示するプログラムを作成せよ。 '0から360までの整数をランダムに10個発生させ、その整数を角度(弧度法)とみなしたとき、その(sin)が最大となる整数を表示する' :- '0から360までの整数をランダムに10個発生させ'(L), findmax([_値,_角度],( append(_,[_角度|R],L), _値 is sin(pi * _角度 / 180)), [_最大値,_最大値の時の角度]), write_formatted('最大値の時の角度は%t度,sinの最大値は%t\n',[_最大値の時の角度,_最大値]). '0から360までの整数をランダムに10個発生させ'(L) :- findall(_ランダム値,( for(1,_,10), _ランダム値 is random mod 361), L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/374 # # はじめまして # # ・Access2000 # # 下のようなテーブルがあったときに # # テーブルA # 名前 科目 点数 # ---------------------- # 岡村 国語 51 # 岡村 数学 48 # 岡村 英語 39 # 徳田 国語 60 # 徳田 数学 30 # 徳田 英語 48 # 渡辺 国語 28 # 渡辺 数学 67 # 渡辺 英語 25 # # 下のように各科目の最高点を名前つきで取得するにはどうすればいいのでしょうか? # # 結果(各科目の最高点) # ---------------------- # 徳田 国語 60 # 岡村 数学 48 # 徳田 英語 48 # # # よろしくおねがいします。 # # # 各科目の最高点を名前つきで取得する(_最高点ならび) :- findsetof(_科目,テーブルA(_,_科目,_),_科目ならび), findall([_最高点氏名,_科目2,_最高点],( member(_科目2,_科目ならび), findmax([_点数,_名前2],テーブルA(_名前2,_科目2,_点数),[_最高点,_最高点氏名])), _最高点ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/627 # # ずぶの素人なのですのでお手柔らかにお願いします # # 今2つのテキストファイルがあって、内容はおおよそ下のようです # # --------------テキストA------------------- # fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 # -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 # -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 # getden1 0 # ------------------------------------------ # # --------------テキストB-------------------- # xred 0.0 0.0 0.047843858990 # 0.0 0.0 0.000434433306 # 1/3 2/3 -0.011730466739 # #Definition of the planewave basis set # ------------------------------------------ # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが # どのようにしたらいいでしょうか # ご教授お願いします # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(_テキストA,_テキストB) :-     get_lines(_テキストA,LinesA),     get_lines(_テキストB,LinesB),     テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC),     put_lines(_テキストB,LineC). テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC) :-     テキストの一番右の列の数値を切り取る(LinesA,LA),     テキストの一番右の列の数値を切り取る(LinesB,LB),     加算([LA,LB],LC),         テキストBの最終数値要素を置換(LB,LC,LineC). テキスト一番右の列の数値を切り取る([],[]) :- !. テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-     split(Line,[ ],L),     数値要素が3個以上(L),     last(L,V),     テキストAの一番右の列の数値を切り取る(R1,R2). テキストBの最終数値要素を置換([],_,[]) :- !. テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-     sPLIT(Line,[ ],L1),     数値要素が3個以上(L1),         length(L1,Len),     findmax(Nth,(            for(1,Nth,Len),            list_nth(Nth,L1,V1),number(V1)),         LastNth),     要素番号によるならびの置換(LastNth,V,L1,L3),     concat_atom(L3,LineC),     テキストBの最終数値要素を置換(R1,R2,R3),!. テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-     テキストBの最終数値要素を置換(R1,L2,R3),!. 数値要素が3個以上(L1) :-     count((member(A,L1),number(A)),Count),     Count >= 3,!. % *** user: sPLIT / 3 *** sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'SPLIT' / 3 *** 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. % *** user: split_00 / 3 *** split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび),atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). % *** user: split_0 / 3 *** split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X) . % *** user: split_1 / 3 *** split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. % *** user: split_2 / 5 *** split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. % *** user: split / 3 *** split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. % *** user: sPlit / 3 *** sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(member(U,_区切り符号ならび))), Z), Z = X,!. % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), open(File_1,write,Output), put_lines(Output,L), close(Output),!. put_lines(Output,[Line|R]) :- is_stream(_,Output,_), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/139 # # 期間の抽出について相談です。 # 元情報 # ID    START    END # -----   -----    ----- # 10    2010/06/01  2010/06/12 # 10    2010/06/13  2010/06/14 # 10    2010/06/15  NULL # 20    2010/06/01  2010/06/11 # 20    2010/06/13  2010/06/15 # ↓ # 欲しい情報 # ID    START    END # -----   -----    ----- # 10    2010/06/01  NULL # 20    2010/06/01  2010/06/11 # 20    2010/06/13  2010/06/15 # # ・開始日、終了日の期間重複はなし # ・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日 # ・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20) # # アドバイス願います。 # # 'IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日' :- findsetof(_ID,期間(_ID,_期間下限,_期間上限),L1), findall([_ID,_最小開始日,_最大終了日],( member(_ID,L1), findmin([_ID,_開始日],開始日(_ID,_開始日),_最小開始日), findmax([_ID,_終了日],終了日(_ID,_終了日),_最大終了日)), L). write('ID START END \n----- ----- ----- \n'), append(_,[[_ID,_Start,_End]|R],L), write_formatted('%t %t %t\n',[_ID,_Start,_End]), R = []. 開始日(_ID,_開始日) :- 期間(_ID,_開始日,_). 終了日(_ID,_終了日) :- 期間(_ID,_開始日,_終了日),\+(_終了日='NULL'). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/48 # # # ・テーブルの構造 # CREATE TABLE IF NOT EXISTS table ( # id integer NOT NULL auto_increment, # value integer NOT NULL, # PRIMARY KEY (id), # ); # # ・テーブルデータ # ID  VALUE # --+-------- # 1  相沢 # 2  飯田 # 3  上井 # # ・操作 # INSERT INTO table(id, value) values # (NULL, '遠藤'), (NULL, '岡田'); # # ・欲しい結果 # 4 # 5 # # ・説明 # ID列をauto_incrementにしているのですが、要素を追加したときに # そのIDを取得したいと考えています。どのようにしたらいいでしょうか? # # 'ID列をauto_incrementにしているのですが、要素を追加したときにそのIDを取得するには'(table,ID) :- auto_increment(TABLE,VALUEs,ID). auto_increment(_表,_値ならび,_付加されるID) :-     length(_値ならび,Len),     length(L,Len),         P =.. [_表,ID0|L],     findmax(ID0,P,Max),     _付加されるID is Max + 1,     Q =.. [_表,_付加されるID|_値ならび],     assertz(Q),!. auto_increment(_表,_値ならび,1) :-     Q =.. [_表,1|_値ならび],     assertz(Q),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1272006124/85 # # <問題> # 与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出しなさい。 与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出す(_文字列,_整数を表す副文字列の中で最長の文字列) :-     atom_chars(_文字列,Chars),     与えられた文字列に含まれる整数を表す副文字列ならび(Chars,_副文字列とその長さならび),     findmax(_文字列長,member([_,_文字列長],_副文字列とその長さならび),_最長文字列長),     member([_整数を表す副文字列の中で最長の文字列,_最長文字列長],_副文字列とその長さならび). 与えられた文字列に含まれる整数を表す副文字列ならび(Chars,[[_副文字列,_文字列長]|R2]) :-     append(_,[A|R],Chars),     A @>= '0',     A @=< '9',     先頭から整数を表す副文字列を切り出す([A|R],_副文字列,_残りならび),     文字列長(_副文字列,_文字列長),     与えられた文字列に含まれる整数を表す副文字列ならび(_残りならび,R2). 与えられた文字列に含まれる整数を表す副文字列ならび(_,[]). 先頭から整数を表す副文字列を切り出す(Chars,'',[B|R2]) :-     append(L1,['.'|R],Chars),     R=[A|R2],     A @>= '0',     A @=< '9',!,         append(_,[B|R2],R),     \+((B @>= '0',B @=< '9')). 先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[A|R]) :-     append(L1,[A|R],Chars),     \+((A @>= '0',A @=< '9')),     concat_atom(Chars,_副文字列),!. 先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[]) :- concat_atom(Chars,_副文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/744 # [1]プログラミング演習 # [2]asciiコード表を出力しなさい。(main関数、プロトタイプ宣言、関数定義を全て書くこと。) # [3]windowsでコンパイラはborland C++ 5.5.1、C言語です。 # [4]火曜日まで # # よろしくお願いします。 # asciiコード表 :- asciiコード表先頭見出し, for(0,M,15), 二進数(4,M,[_m1,_m2,_m3,_m4]), write_formatted('%01d%01d%01d%01d %4d ',[_m1,_m2,_m3,_m4,M]), for(0,N,7), asciiコード表行表示(M,N), N = 7, write('\n'), M = 15. asciiコード表先頭見出し :- asciiコード表文字列最大byte長(_asciiコード表文字列最大byte長), _asciiコード表文字列最大byte長_2 is _asciiコード表文字列最大byte長 + 2, for(0,N1,7), 二進数(4,7,[_n1,_n2,_n3,_n4]), asciiコード表先頭見出し_1(_asciiコード表文字列最大byte長_2,N1,_n1,_n2,_n3,_n4), N1 = 7, write('\n'), for(0,N2,7), asciiコード表先頭見出し_2(N2), N1 = 7, write('\n'),!. asciiコード表先頭見出し_1(_欄の枠,N,_n1,_n2,_n3,_n4) :- N >= 0,N =< 1, write_formatted_atom('%01d%01d%01d%01d',[_n1,_n2,_n3,_n4],A), 文字列を欄の中心に据えて表示(_欄の枠,A),!. asciiコード表先頭見出し_1(_,N,_n1,_n2,_n3,_n4) :- N > 1, write_formatted_atom('%01d%01d%01d%01d',[_n1,_n2,_n3,_n4],A), 文字列を欄の中心に据えて表示(8,A),!. asciiコード表先頭見出し_2(N) :- N >= 0,N =< 1, write_formatted_atom('%1d',[N],A), 文字列を欄の中心に据えて表示(35,A),!. asciiコード表先頭見出し_2(N) :- N > 1, write_formatted_atom('%1d',[N],A), 文字列を欄の中心に据えて表示(8,A),!. asciiコード表行表示(M,N) :- M >=0,M =<1, _アスキーコード is 16 * M + N, asciiコード表(_アスキーコード,_,_文字列), 文字列を欄の中心に据えて表示(35,_文字列),!. asciiコード表行表示(M,N) :- M > 1, _アスキーコード is 16 * M + N, asciiコード表(_アスキーコード,_,_文字列), 文字列を欄の中心に据えて表示(8,_文字列),!. 文字列を欄の中心に据えて表示(_欄の桁,_文字列) :- name2(_文字列,L), length(L,_文字列長), _頭部の空白数 is (_欄の桁 - _文字列長) // 2, _尾部の空白数 is (_欄の桁 - _文字列長 - _頭部の空白数), concat_atom(['%',_頭部の空白数,s,'%s%',_尾部の空白数],F), writef(F,[' ',_文字列,' ']),!. asciiコード表文字列最大byte長(_asciiコード表文字列最大byte長) :- findmax(Byte長,(asciiコード表(_,_,_文字列),name(_文字列,L),length(L,Byte長)),_asciiコード表文字列最大byte長). asciiコード表(0,'0x00','NUL(null文字) '). asciiコード表(1,'0x01','SOH(ヘッダ開始)'). asciiコード表(2,'0x02','STX(テキスト開始)'). asciiコード表(3,'0x03','ETX(テキスト終了)'). asciiコード表(4,'0x04','EOT(転送終了)'). asciiコード表(5,'0x05','ENQ(照会)'). asciiコード表(6,'0x06','ACK(受信OK)'). asciiコード表(7,'0x07','BEL(警告)'). asciiコード表(8,'0x08','BS(後退)'). asciiコード表(9,'0x09','HT(水平タブ)'). asciiコード表(10,'0x0a','LF(改行)'). asciiコード表(11,'0x0b','VT(垂直タブ)'). asciiコード表(12,'0x0c','FF(改頁)'). asciiコード表(13,'0x0d','CR(復帰)'). asciiコード表(14,'0x0e','SO(シフトアウト)'). asciiコード表(15,'0x0f','SI(シフトイン)'). asciiコード表(16,'0x10','DLE(データリンクエスケープ)'). asciiコード表(17,'0x11','DC1(装置制御1)'). asciiコード表(18,'0x12','DC2(装置制御2)'). asciiコード表(19,'0x13','DC3(装置制御3)'). asciiコード表(20,'0x14','DC4(装置制御4)'). asciiコード表(21,'0x15','NAK(受信失敗)'). asciiコード表(22,'0x16','SYN(同期)'). asciiコード表(23,'0x17','ETB(転送ブロック終了)'). asciiコード表(24,'0x18','CAN(とりけし)'). asciiコード表(25,'0x19','EM(メディア終了)'). asciiコード表(26,'0x1a','SUB(置換)'). asciiコード表(27,'0x1b','ESC(エスケープ)'). asciiコード表(28,'0x1c','FS(フォーム区切り)'). asciiコード表(29,'0x1d','GS(グループ区切り)'). asciiコード表(30,'0x1e','RS(レコード区切り)'). asciiコード表(31,'0x1f','US(ユニット区切り)'). asciiコード表(32,'0x20','(スペース)'). asciiコード表(33,'0x21',!). asciiコード表(34,'0x22','"'). asciiコード表(35,'0x23',#). asciiコード表(36,'0x24',$). asciiコード表(37,'0x25','%'). asciiコード表(38,'0x26','&'). asciiコード表(39,'0x27',''''). asciiコード表(40,'0x28','('). asciiコード表(41,'0x29',')'). asciiコード表(42,'0x2a',*). asciiコード表(43,'0x2b',+). asciiコード表(44,'0x2c',','). asciiコード表(45,'0x2d',-). asciiコード表(46,'0x2e','.'). asciiコード表(47,'0x2f',/). asciiコード表(48,'0x30','0'). asciiコード表(49,'0x31','1'). asciiコード表(50,'0x32','2'). asciiコード表(51,'0x33','3'). asciiコード表(52,'0x34','4'). asciiコード表(53,'0x35','5'). asciiコード表(54,'0x36','6'). asciiコード表(55,'0x37','7'). asciiコード表(56,'0x38','8'). asciiコード表(57,'0x39','9'). asciiコード表(58,'0x3a',:). asciiコード表(59,'0x3b',;). asciiコード表(60,'0x3c',<). asciiコード表(61,'0x3d',=). asciiコード表(62,'0x3e',>). asciiコード表(63,'0x3f',?). asciiコード表(64,'0x40',@). asciiコード表(65,'0x41','A'). asciiコード表(66,'0x42','B'). asciiコード表(67,'0x43','C'). asciiコード表(68,'0x44','D'). asciiコード表(69,'0x45','E'). asciiコード表(70,'0x46','F'). asciiコード表(71,'0x47','G'). asciiコード表(72,'0x48','H'). asciiコード表(73,'0x49','I'). asciiコード表(74,'0x4a','J'). asciiコード表(75,'0x4b','K'). asciiコード表(76,'0x4c','L'). asciiコード表(77,'0x4d','M'). asciiコード表(78,'0x4e','N'). asciiコード表(79,'0x4f','O'). asciiコード表(80,'0x50','P'). asciiコード表(81,'0x51','Q'). asciiコード表(82,'0x52','R'). asciiコード表(83,'0x53','S'). asciiコード表(84,'0x54','T'). asciiコード表(85,'0x55','U'). asciiコード表(86,'0x56','V'). asciiコード表(87,'0x57','W'). asciiコード表(88,'0x58','X'). asciiコード表(89,'0x59','Y'). asciiコード表(90,'0x5a','Z'). asciiコード表(91,'0x5b','['). asciiコード表(92,'0x5c',\). asciiコード表(93,'0x5d',']'). asciiコード表(94,'0x5e',^). asciiコード表(95,'0x5f','_'). asciiコード表(96,'0x60',`). asciiコード表(97,'0x61',a). asciiコード表(98,'0x62',b). asciiコード表(99,'0x63',c). asciiコード表(100,'0x64',d). asciiコード表(101,'0x65',e). asciiコード表(102,'0x66',f). asciiコード表(103,'0x67',g). asciiコード表(104,'0x68',h). asciiコード表(105,'0x69',i). asciiコード表(106,'0x6a',j). asciiコード表(107,'0x6b',k). asciiコード表(108,'0x6c',l). asciiコード表(109,'0x6d',m). asciiコード表(110,'0x6e',n). asciiコード表(111,'0x6f',o). asciiコード表(112,'0x70',p). asciiコード表(113,'0x71',q). asciiコード表(114,'0x72',r). asciiコード表(115,'0x73',s). asciiコード表(116,'0x74',t). asciiコード表(117,'0x75',u). asciiコード表(118,'0x76',v). asciiコード表(119,'0x77',w). asciiコード表(120,'0x78',x). asciiコード表(121,'0x79',y). asciiコード表(122,'0x7a',z). asciiコード表(123,'0x7b','{'). asciiコード表(124,'0x7c','|'). asciiコード表(125,'0x7d','}'). asciiコード表(126,'0x7e',~). asciiコード表(127,'0x7f','DEL(削除)'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% name2(X,Y) :- atom(X), strlen(X,Len), findall(N,(for(1,M,Len) , char_code1(X,M,N1) , (N1 < 0 , N is N1 + 256 ; N1 >= 0 , N = N1)),Y),!. name2(A,[N]) :- atomic(A), name(A,[N]),!. name2(A,L) :- var(A), name21(L,L2), atom_codes(A,L2),!. name21([],[]) :- !. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 > 127, N is N1 * 256 + N2, name21(R,R2),!. name21([N1,N2|R],[N|R2]) :- N1 > 127, N2 < 128, N is N1 * 256 + N2, name21(R,R2),!. name21([N1|R],[N1|R2]) :- name21(R,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/416 # # 数当てゲーム1 乱数当て # プログラムで一つの整数乱数aを生成し、その値を当てさせる。 # 入力された値がaより小さい時は「もっと大きいよ」、aより小さい時は「もっと小さいよ」と出力し、当てるまで繰り返しをする。 # # プログラムの例 # Srand (time(NULL)); # a=rand(); # # プログラムの最初にRAND_MAXを出力したほうがわかりやすい # # -------------------------------------------------------------------------------- # # 数当てゲーム2 0〜999の当て # 先ほどのプログラムを更に改善し、0〜999までの整数乱数を生成せよ # # --------------------------------------------------------------------------------- # # 数当てゲーム3 当て回数の制限 # さらに改善し、当てる回数に制限を付ける、例えば10回など # 当てる度に残っている回数を表示する。回数に達するとプログラム終了 :- op(250,xf,より大きい). :- op(250,xf,より小さい). 履歴を持った数当てゲームサーバ :- 乱数を引き正解値を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,[]). 履歴を持った数当てゲームサーバ(_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). 乱数を引き正解値を決める(_正解) :- _正解 is random. 当てずっぽ数をひとつ得る(_当てずっぽ数) :- repeat, write('さあ、なににしますか? '), get_integer(_当てずっぽ数),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より大きい|R],Max より大きい) :- _当てずっぽの数 < _正解, \+(_当てずっぽの数 > N), findmax(M,member(M より大きい,[N より大きい|R]),Max),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より小さい|R],Min より小さい) :- _当てずっぽの数 > _正解, \+(_当てずっぽの数 < N), findmin(M,member(M より小さい,[N より小さい|R]),Min),!. すでにヒントの中に含まれている(_当てずっぽの数,[_|R],X) :- すでにヒントの中に含まれている(_当てずっぽの数,R,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '乱数を引き正解値(0〜999)を決める'(_正解値) :- _乱数値 is random, 乱数の範囲を0〜999に絞り込む(_乱数値,_正解値). 乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :- _絞り込まれた乱数値 is _乱数値 mod 1000. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(250,xf,より大きい). :- op(250,xf,より小さい). ゲームオーバーとなる解答限界数(10). 履歴を持った回数制限付き数当てゲームサーバ :- ゲームオーバーとなる解答限界数(Max), 乱数を引き正解値(0〜999)を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(1,Max,_当てずっぽの数,_正解,[]). 履歴を持った回数制限付き数当てゲームサーバ :- 履歴を持った回数制限付き数当てゲームサーバ. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_,_,_) :- M > Max, write_formatted('選択した数が%t個を越えました ゲームオーバー!!\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(_,_,_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った数当てゲームサーバ(M2,Max,_当てずっぽの数,_正解,_履歴). 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M2,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). '履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれてる(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 当てずっぽクライアント :- Maxint is maxint, ある範囲の乱数を得る(1,Maxint,Random), 当てずっぽクライアント(1,Maxint,Random). 当てずっぽクライアント(M,Maxint,Random) :- write('選択値 = %t\n',[Random]), get_line(Line), 当てずっぽクライアント(Line,M,Maxint,Random), 当てずっぽクライアント(Random,Maxint,Random2). 当てずっぽクライアント('もっと大きいよ',M,Maxint,Random,Maxint,Random,Random2) :- ある範囲の乱数を得る(Random,Maxint,Random2),!. 当てずっぽクライアント('もっと小さいよ',M,Maxint,M,Random,Random,Random2) :- ある範囲の乱数を得る(M,Random,Random2), ある範囲の乱数を得る(_下限,_上限,_乱数) :- J is _上限 - _下限 + 1, _乱数 is random mod J + _下限. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/713 # # # A B C # - - - # 1 3 a # 1 5 b # 2 8 c # 2 4 d # 2 6 e # 3 3 f # 3 1 g # # 上記のようなSAMPLEテーブルがあるとき、 # AごとにBが最大となるレコードのCを得たい、 # つまり、抽出結果を下記のようにしたいと考えています。 # # A C # - - # 1 b # 2 c # 3 f 'SAMPLE'('1','3','a'). 'SAMPLE'('1','5','b'). 'SAMPLE'('2','8','c'). 'SAMPLE'('2','4','d'). 'SAMPLE'('2','6','e'). 'SAMPLE'('3','3','f'). 'SAMPLE'('3','1','g'). 'AごとにBが最大となるレコードのCを得る'(X,Y) :- findsetof(A,'SAMPLE'(A,_,_),L), member(A,L), findmax([B,A,C],'SAMPLE'(A,B,C),[_,X,Y]). findsetof(A,B,C) :- findall(A,B,L), setof(A,member(A,L),C). findmax(A,P,X) :- findall(A,P,L), sort(L,L2), last(L2,X). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/599 # # 以下のSQLで最新日の2000円以上の売上があった商品を抽出しているんですが、 # SELECT * FROM SALES WHERE uriage >= 2000 AND date = (select max(date) from SALES) # 「その商品の前回売上があった日の売上額」と「前回の売上と比べてどれだけ増えたのかの増加率」 # を出したい場合どうしたらいいでしょう? # # 商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率 # 3 | 1267714800 | 2500 | ????? | ????? # 4 | 1267714800 | 2800 | ????? | ????? # # [日付の形式はunixtimeで、データ登録の際は日付だけ変更させ、時間と秒は常に統一させています] # [mysql 5.1] # 前回売上との比較売上表(_年/_月/_日) :-     findall(_商品ID,(売上(_商品ID,_日付,_),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上のあった商品IDならび), sort(_売上のあった商品IDならび     member(_商品ID2,_売上のあった商品IDならび),     当日の売上金額計(_商品ID2,_年/_月/_日,_売上金額計),     前回売上があった日(_商品ID2,_日付,_前回売上があった日),     前回売上があった日の売上金額計(_商品ID2,_前回売上があった日,_前回売上があった日の売上金額計),     売上行表示(_商品ID2,_年/_月/_日,_売上金額計,_前回売上があった日の売上金額計),     fail. 前回売上との比較売上表(_,_,_). 前回売上があった日(_商品ID,_日付,_前回売上があった日) :-     localtime(_日付,_年1,_月1,_日1,_,_,_,_),     findmax(_年2/_月2/_日2,(売上(_商品ID,_日付2,_),localtime(_日付2,_年2,_月2,_日2,_,_,_,_),_年1/_月1,_日1 @> _年2/_月2/_日2),_前回売上があった日). 前回売上があった日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付2,_売上金額),localtime(_日付2,_年,_月,_日,_,_,_,_)),_売上金額計). 当日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付,_売上金額),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上金額計). 売上行表示(_商品ID,_年/_月/_日,_売上金額計,0.0) :-     write_formatted('%8d | %2d/%2d/%2d | %12.0f\n',[_商品ID2,_年/_月/_日,_売上金額計]),!. 売上行表示(_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計) :-     _売上増加率 is _売上金額計 / _前回売上のあった日の売上金額計,     write_formatted('%8d | %2d/%2d/%2d | %12.0f | %12.0f | %4.1f\n',[_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計,_売上増加率]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/148 # # [1] 授業単元: ゼミ演習でのプログラミング # [2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10566.zip # # [1] ヒストグラム # 0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力するプログラムを書きなさい# # '0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力する' :- 0〜9の範囲内の整数を20個入力し(1,_サンプルならび), ヒストグラム(_サンプルならび). ヒストグラム(_サンプルならび) :- 最初に縦棒の限界数を決めよう(_サンプルならび,_限界数), '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび), 転置(_度数表示ならび,_転置した度数表示ならび), ヒストグラム表示(_転置した度数表示ならび). 最初に縦棒の限界数を決めよう(_サンプルならび,_限界数) :- findmax(U,count(member(U,_サンプルならび)),_限界数). '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび) :- findall(_度数表示, (for(0,N,9),count(member(N,_サンプルならび),_度数), '空白が先に来るように反転した*ならびの生成'(_度数,1,_限界数,[],_度数表示)), _度数表示ならび). '空白が先に来るように反転した*ならびの生成'(_,N,_限界数,X,X) :- N > _限界数,!. '空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :- N > _度数, N2 is N + 1, '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,[' '|Y],X). '空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :- N =< _度数, N2 is N + 1, '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,['*'|Y],X). ヒストグラム表示([]) :- !. ヒストグラム表示([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),ヒストグラム表示(R). 0〜9の範囲内の整数を20個入力し(M,[]) :- M > 20,!. 0〜9の範囲内の整数を20個入力し(M,[N|R]) :- write_formatted('%t個目 : ',[M]), get_integer(N), N >= 0, N =< 9, M2 is M + 1, 0〜9の範囲内の整数を20個入力し(M2,R),!. 0〜9の範囲内の整数を20個入力し(M,L) :- write('0〜9の範囲内の整数を入力してください\n'), 0〜9の範囲内の整数を20個入力し(M,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/83 # # [1] 授業単元: Cプログラム応用A # [2] 問題文(含コード&リンク): # 文字列操作の標準ライブラリ関数を使用し、指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示せよ。 # ただし、同じ長さの単語がある場合最初に見つけた一つでいい。 # # ここでの単語とは、スペースや改行、タブで区切られた文字列のことである。 # ただし、単語の長さは100文字以内と考えていい。 # 指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示する(_ファイル,_最初の単語,_最後の単語,_最もながい単語) :-   get_lines(_ファイル,Lines),   concat_atom(Lines,S),   split(S,[' ','\t','\n'],_単語ならび),   sort(_単語ならび,_整列された単語ならび),   append([_最初に出てくる単語|_],[_最後に出てくる単語],_整列された単語ならび),   findmax(_長さ,(member(_単語,_単語ならび),sub_atom(_単語,_,_長さ,_,_単語)),_最もながい長さ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/678 # # [1] 授業単元: 基礎プログラミングおよび演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10352.txt # # あるWebページに対する24時間分の閲覧者の名前、閲覧開始時刻および閲覧継続時間を表す「閲覧データ」があるとしよう。 # 1名以上の閲覧データから、閲覧している人数がもっとも多い30分刻みでの時間帯を求め、そのときの閲覧者名を印字する # プログラムを作成せよ。状況によっては日をまたぐこともあるが、ここではどの時間帯に閲覧が多いのかを知りたいので # 日の違いは考えなくてよい。各閲覧データは標準入力から、 # # 閲覧者名 # 閲覧開始時刻 閲覧継続時間 # # の2行で与えられる。ここで閲覧者名は英小文字2文字の後に4桁の数字が続く。閲覧開始時刻は24時間制での時を100倍し、 # 分を加えた数を表す4桁の数字、閲覧継続時間は分を表す高々3桁の数字である。時刻および時間は30分刻み(つまり0分か30分) # である。たとえば、 # # ku7535 # 0130 60 # # は、名前がku7535、開始時刻が1時30分、継続時間が60分、つまり1時30分から2時30分直前まで閲覧していたことを表す。 # まず閲覧データに対する構造体 user を定義し、それを要素とする大きさNの大域的な配列 users を用意せよ(Nはマクロ # である)。次に、N人分のデータを読み込むか、閲覧者名としてアスタリスク(*)が与えられるまで、標準入力から閲覧データを # 読み込み、配列 users にセットするとともに閲覧データを返す関数 int read_users(void) を作成せよ。最後に配列 users の # 先頭からn個の閲覧データを対象に、24時間中で最大人数が閲覧している30分刻みでの時間帯と、そのときの閲覧者名を印字 # する関数 void print_prime_time(int n) を定義せよ。ただし最大閲覧者数となる時間帯は一般に複数あることに注意すること。 # さらに以下のmain関数と組み合わせてプログラムを作成せよ。 標準入力から閲覧履歴読み込む(_閲覧履歴ならび) :- get_lines(Lines), 閲覧者情報の取得(Lines,_閲覧履歴ならび), 閲覧者履歴の登録(_閲覧者履歴ならび),!. 閲覧履歴の取得と登録([],[]) :- !. 閲覧履歴の取得と登録([_閲覧者名,B|R1],[[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R2]) :- split(B,[' '],[_閲覧開始時刻,_閲覧継続時間]), assertz(閲覧履歴(_閲覧者名,_閲覧開始時刻,_閲覧継続時間)), 閲覧履歴の取得と登録(R1,R2),!. 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名を印字(N,_時,_分,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび), _時 is _時刻 // 100, _分 is _時刻 mod 100, concat_atom(_閲覧者ならび,' ',_閲覧者ならび表示), write_formatted('最多閲覧時間 %t時%t分から %t\n',[_時,_分,_閲覧者ならび表示]). 先頭からn個の閲覧データを対象に、24時間中で最多人数が閲覧している30分刻みでの時刻と、そのときの閲覧者名(N,_閲覧履歴ならび,_時刻,_閲覧者ならび) :- 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ), 閲覧分布ならびを作る(_先頭からn個のデータ,_履歴分布ならび), 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび), member(_時刻,_最多閲覧者時刻), setof(_閲覧者名,member([_閲覧者名,_時刻,_],_履歴分布ならび),_閲覧者ならびの一). 先頭からn個の閲覧データを対象に(N,_閲覧履歴ならび,_先頭からn個のデータ) :- length(_先頭からn個のデータ,N), append(_先頭からn個のデータ,_,_閲覧履歴ならび),!. 閲覧分布ならびを作る([],[]) :- !. 閲覧分布ならびを作る([[_閲覧者名,_閲覧開始時刻,_閲覧継続時間]|R1],X) :- 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,L), 閲覧分布ならびを作る(R1,Y), append(L,Y,X). 閲覧継続時間を30分ごとに刻む(_,_,0,[]) :- !. 閲覧継続時間を30分ごとに刻む(_閲覧者名,_閲覧開始時刻,_閲覧継続時間,[[_閲覧者名,_閲覧開始時刻,30]|R]) :- 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻), _閲覧継続時間2 is _閲覧継続時間 - 30, 閲覧継続時間を30分ごとに刻む(_閲覧者名,_次の閲覧開始時刻,_閲覧継続時間2,R),!. 次の30分を閲覧開始時刻とする(2330,0) :- !. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 30 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 - 30 + 100,!. 次の30分を閲覧開始時刻とする(_閲覧開始時刻,_次の閲覧開始時刻) :- 0 is _閲覧開始時刻 mod 100, _次の閲覧開始時刻 is _閲覧開始時刻 + 30,!. 最多閲覧者時刻(_履歴分布ならび,_最多閲覧者時刻ならび) :- findall(L1,setof(_閲覧開始時刻,member([_,_閲覧開始時刻,_],_履歴分布ならび),L1),L2), 最多閲覧者時刻の二(L2,_履歴分布ならび,L3), findmax(Count,member([Count,_,_],L3),Max), findall([_閲覧開始時刻,_閲覧者ならび],member([Max,_閲覧開始時刻,_閲覧者ならび],L3),_最多閲覧者時刻ならび). 最多閲覧者閲覧開始時刻の二([],_,[]) :- !. 最多閲覧者閲覧開始時刻の二([[_閲覧開始時刻]|R1],_履歴分布ならび,[[Count,_閲覧開始時刻,L1]|R2]) :- findall([_閲覧者名,_閲覧開始時刻],member([_閲覧者,_閲覧開始時刻,_],_履歴分布ならび),L1), length(L1,Count), 最多閲覧者閲覧開始時刻の二(R1,_履歴分布ならび,R2). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/212 # # # 【質問テンプレ】 # ・DBMS名とバージョン:MySQL 5.1 # ・テーブルデータ # # テーブルA # # A_ID PRIMARY # DATA1 # DATA2 # DATA3 # DATA4 # # テーブルB # # B_ID PRIMARY AUTO_INCREMENT # A_ID # MESSAGE # DATE # # ・欲しい結果 # テーブルAとテーブルBを結合し、以下のように表示させたいです。 # # A.A_ID (B.A_IDを参照し、テーブルBにあるMESSAGEを反映させたい) # A.DATA1 # A.DATA2 # A.DATA3 # A.DATA4 # B.MESSAGE (A.A_ID=B.B_IDと対応させ、NULLの場合はそのままNULLを表示、メッセージが存在する場合はDATEが最新の物のみ表示) # # ・説明 # 現在、LEFT JOINでテーブルAとテーブルBを結合した物を表示させ、 # テーブルBのMESSAGEにメッセージがあろうとNULLであろうと結合したテーブルの結果をすべて表示し、 # GROUP BY A.A_IDで、A.A_IDのエントリーは1つしか表示されないようにしているのですが、 # この状態だと、一番古いMESSAGEが表示されてしまいます。 sql_212 :- テーブルA(A_ID,DATA1,DATA2,DATA3,DATA4), テーブルB(B_ID,A_ID,MESSAGE,DATE), write_formatted('A.%t\nA.%t\nA.%t\nA.%t\n',[DATA1,DATA2,DATA3,DATA4]), fail. sql_212 :- findmax([DATE,MESSAGE],(テーブルA(A_ID),テーブルB(A_ID,_,MESSAGE,DATE)),[MaxDATE,MaxMESSAGE]), write_formatted('B.%t\n',[MaxMESSAME]), fail. sql_212. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258320456/47 # # 【 課題 】四人一首問題。「かるた部」の練習の一環として、 # 百人一首の中から第一文字が「や」の四枚を選んで、徹底的に練習することに # しました。四枚とは、 # やすらはでねなましものをさよふけてかたぶくまでのつきをみしかな # やへむぐらしげれるやどのさびしきにひとをもみをみうらみざらまし # やまざとはふゆぞさびしさまさりけるひとめもくさもかれぬとおもへば # やまがはにかぜのかけたるしがらみはながれもあへぬもみぢなりけり # ルールは、 # 1) 二人ゲームである。 # 2) 四枚のなかから無作為に二枚を選び自分と相手の札とする。 # 3) 読み手は四枚全部読み上げる。いたがって空札(取る札がない)が二枚含まれる。 # 4) 一枚取った時点で勝負はつくが、残りの一枚も競うこととする。 # # [問題] 乱数を使ってそれぞれの持ち札を決め、それを表示します。 # つぎに、読み札の順番を決めます。これはこの段階では表示しません。 # 一首、読み、それを表示し、 # 1) 空札 : 何文字目まで読まれてそれがわかったか # 2) 相手札 : 同上 # 3) 自分札 : 同上 # を表示しなさい。これを繰り返し、取り札がなくなったらゲームオーバー。 # 4) 二つのモードで作りなさい #  1) 読まれた札を二人とも記憶している。 #  2) 読まれた札は忘れてしまう。 # 実際には取り札には下の句が書かれていますが、ここでは一首全体をお互い理解しているものとします。 # # 歌([や,す,ら,は,で,ね,な,ま,し,も,の,を,さ,よ,ふ,け,て,か,た,ぶ,く,ま,で,の,つ,き,を,み,し,か,な]). 歌([や,へ,む,ぐ,ら,し,げ,れ,る,や,ど,の,さ,び,し,き,に,ひ,と,を,も,み,を,み,う,ら,み,ざ,ら,ま,し]). 歌([や,ま,ざ,と,は,ふ,ゆ,ぞ,さ,び,し,さ,ま,さ,り,け,る,ひ,と,め,も,く,さ,も,か,れ,ぬ,と,お,も,へ,ば]). 歌([や,ま,が,は,に,か,ぜ,の,か,け,た,る,し,が,ら,み,は,な,が,れ,も,あ,へ,ぬ,も,み,ぢ,な,り,け,り]). 四人一首(_) :- findall(X,歌(X),_歌ならび), 一枚読む(_歌ならび, _歌ならび, _自分の手持ち札ならび, _相手の手持ち札ならび, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか), 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび, _自分の手持ち札, _相手の手持ち札, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 間を取る, 現在の決まり字(_まだ読ませていない札ならび,_自分の手持ち札ならび,_相手の手持ち札ならび,_決まり字ならび), 間を取る, 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか), 決まり字はどこにある(_どんな札か,_自分の手持ち札ならび,_相手の手持ち札ならび,_どちら). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび1, _自分の手持ち札1, _相手の手持ち札1, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 現在の決まり字(_まだ読まれていない札ならび,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_決まり字ならび1), 決まり字で空札または札を取る(_読み札,_決まり字ならび1,_どんな札か1,_何字目でそれがわかったか1), 決まり字はどこにある(_どんな札か1,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_どちら1), ならびから削除(_読み札,_まだ読まれていない札ならび,_まだ読まれていない札ならび2), ならびから削除(_読み札,_自分の手持ち札1,_自分の手持ち札2), ならびから削除(_読み札,_相手の手持ち札1,_相手の手持ち札2), 一枚読む(_残り読み札, _まだ読まれていない札ならび2, _自分の手持ち札2, _相手の手持ち札2, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか). 現在の決まり字(_まだ読まれていない札ならび,_自分の手元札ならび,_相手の手元札ならび,_決まり字ならび) :- append(_自分の手持ち札ならび,_相手の手持ち札ならび,_手持ち札として存在する札ならび), 決まり字判断(_手持ち札として存在する札ならび,_まだ読まれていない札ならび,_決まり字ならび). 決まり字判断([],_,[]) :- !. 決まり字判断([_手持ち札|R1],_まだ読まれていない札ならび,[[_手持ち札,Len,_決まり字]|R2]) :-   先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字),   決まり字判断(R1,_まだ読まれていない札ならび,R2). 先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字) :-   findmax([Len,_決まり字],     (  member(_札,_まだ読まれていない札ならび),       \+(_札=_手持ち札),       先頭から共通部分の次の文字まで(1,_手持ち札,_札,_決まり字,Len)),[Len,_決まり字]),!. 先頭から共通部分の次の文字までで最長のもの([_決まり字|_],_,[1,_決まり字]). 先頭から共通部分の次の文字まで(N,[A|R1],[A|R2],[A|R3],Len) :-   N2 is N + 1,   先頭から共通部分の次の文字まで(R1,R2,R3,Len),!. 先頭から共通部分の次の文字まで(Len,[A|R1],_,[A],Len). 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- atom_chars(_読み札,Chars1), append(L1,[_文字|L2],Chars1), 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか). 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- append(L1,[_文字],_決まり字), member([_どんな札か,_何字目でそれがわかったか,_決まり字],_決まり字ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,自分の手持ち札) :- member(_札,_自分の札ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,相手の手持ち札) :- member(_札,_相手の手持ち札ならび). 間を取る. 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか) :- write('私の札は\n'), writeAln(_自分の手持ち札ならび), write('相手の札は\n'), writeAln(_相手の手持ち札ならび), write('読み札は\n'), writeAn(_読み札), write_formatted('どこにあるか %t\n何字目でそれがわかったか %t字目\n',[_どちら,_何字目でそれがわかったか]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% writeAln([]). writeAln([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),writeAln(R). writeAn(L) :- concat_atom(L,A),write_formatted('%t\n',[A]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :-   データファイルの読み出し(_ファイル名,N,_価格ならび,_重さならび),   findall(M,for(1,M,N),_1からNまで),   findmax(_合計価格,詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格),_詰めることのできる最高合計金額). データファイルの読み出し(_ファイル名,N,_重さならび,_価格ならび) :-   see(_ファイル名),get_integer(N),get_integers(L1),seen,   length(L2,N),length(L3,N),   append(_重さならび,_価格ならび,L1),!. 詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格) :-   for(1,M,N),   組合せ(_1からNまで,M,L),   findsum(Wi,(member(A,L),list_nth(A,_重さならび,Wi)),_合計重量),   _合計重量 =< _許容最大重量,   findsum(Pi,(member(A,L),list_nth(A,_価格ならび,Pi)),_合計金額). get_integers(L) :-   findall(I,(get_line(Line),(Line=end_of_file,!,fail;atom_to_term(Line,I,_))),L),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/330 # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】10月17日 # 【 Ver  】1.6.0_11 # # A= # {-7.29565,6.54738,4.07991} # {-5.58592,7.51773,-1.78163} # {9.22599,-3.26847,-3.03223} # {6.25081,-8.75345,-4.31528} # # 行列norm ||A||1、||A||∞を求めるプログラムを作成せよ # # # 参考になるかはわかりませんが、複素数ベクトル版の2-norm、∞-normを # 求めるプログラムはこれです # http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/803.java norm(_行列,1,X) :- 行列の転置(_行列,_行列1), findmax(S,(member(L,_行列1),abs_sum(L,S)),X). norm(_行列,inf,X) :- findmax(S,(member(L,_行列),abs_sum(L,S)),X). norm(_行列,N,X) :- integer(N), findsum(S1,(member(L,_行列) , 'N乗_sum'(L,N,S1)),Y), X is Y ^ (1 / N). abs_sum([],0) :- !. abs_sum([A|R1],S) :- abs_sum(R1,S1), S is abs(A) + S1. 'N乗_sum'([],N,0) :- !. 'N乗_sum'([A|R1],N,S) :- 'N乗_sum'(R1,N,S1), S is A^N + S1. % 以下のサイトは # 出典::C/C++の宿題片付けます 第130代目 #676 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 '以下のプログラムを作成せよ。 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される このような点数の変換プログラムを考える 達成条件は ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 ・ファイルからデータを読み込んだ時に、構造体にデータを入力している ・ファイルout.txt内では、正しく点数が変換されている。' :- get_lines('in.txt',Lines), 点数を嵩上げ計算する(Lines,L2), '変換された点数データをファイルoutput.txtに書き込んでいる。'('out.txt',L2). 点数を嵩上げ計算する(Lines,L2) :- 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL), 三科目の最高点を得る(LL,MaxA,MaxB,MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2). 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL) :- findall([Name2,A1,B1,C1],( member(Line,Lines), split(Line,[' ',','],[Name1,A1,B1,C1]), 名前の長さ制限(Name1,Name2)), LL). 三科目の最高点を得る(L,MaxA,MaxB,MaxC) :- findmax(A,(member([_,A,_,_],L)),MaxA), findmax(B,(member([_,_,B,_],L)),MaMaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2) :- findall(表示行,( member([Name,A2,B2,C2],LL), 嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX), atomic_list_concat([Name,AX,BX,CX],',',表示行)), L2). 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(_バイト累計_1,[A|R1],[A|R2]) :- char_code(A,Code), 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2), 名前の長さ制限(_バイト累計_2,R1,R2). 名前の長さ制限(_,_,[]). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2). 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code > 255, _バイト累計_1 < 19, _バイト累計_2 is _バイト累計_1 + 2. 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code < 256, _バイト累計_1 < 20, _バイト累計_2 is _バイト累計_1 + 2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/676 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 t741 :- get_lines('in.txt',Lines), findall([Name2,A1,B1,C1],(member(Lines),split(Lines,[' ',','],[Name1,A1,B1,C1]),名前の長さ制限(Name1,Name2)),L), findmax(A,(member([_,A,_,_],L),MaxA), findmax(B,(member([_,_,B,_],L),MaxB), findmax(A,(member([_,_,_,C],L),MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), findall(S,( member([Name,A2,B2,C2],L),嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX),concat_atom([Name,AX,BX,CX],',',S)),L2), put_lines('out.txt',L2). 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(M,_,[]) :- M > 20,!. 名前の長さ制限(M,[A|R1],[]) :- char_code(A,Code), Code > 255, M > 18,!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code > 255, M < 19, M2 is M + 2, 名前の長さ制限(M2,R1,R2),!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code < 256, M2 is M + 1, 名前の長さ制限(M2,R1,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/444 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):比較:文字列2つ入力後、先頭から5文字を #   比較した結果を表示しなさい % 課題とは離れて述語を定義することにしました。 t697(Atom1,Atom2,_診断ならび) :- findall([_診断項目,_診断結果],t697_診断(_診断項目,Atom1,Atom2,_診断結果),_診断ならび). t697(Atom1,Atom2,N,_診断ならび) :- sub_atom(Atom1,0,N,_,Atom1_1), sub_atom(Atom2,0,N,_,Atom2_1), findall([_診断項目,_診断結果],t697_診断(_診断項目,Atom1_1,Atom2_1,_診断結果),_診断ならび). t697_診断(文字列長比較,Atom1,Atom2,Op) :- atom_length(Atom1,Len1), atom_length(Atom2,Len2), compare(Op,Len1,Len2). t697_診断(文字列長差,Atom1,Atom2,_差) :- atom_length(Atom1,Len1), atom_length(Atom2,Len2), _差 is Len1 - Len2. t697_診断(一致,Atom1,Atom2,一致) :- Atom1 = Atom2. t697_診断(一致,Atom1,Atom2,不一致) :- Atom1 \= Atom2. t697_診断(大小比較,Atom1,Atom2,Op) :- compare(Op,Atom1,Atom2). t697_診断(共通文字,Atom1,Atom2,_共通文字ならび) :- atom_chars(Atom1,Chars1), atom_chars(Atom2,Chars2), 積集合(Chars1,Chars2,_共通文字ならび). t697_診断(先頭からの共通文字列,Atom1,Atom2,_先頭からの共通文字列) :- findmax([N,X],(sub_atom(Atom1,0,N,_,X),sub_atom(Atom2,0,N,_,X)),L), max(L,[_,_先頭からの共通文字列]). t697_診断(先頭からの共通文字列長さ,Atom1,Atom2,_先頭からの共通文字列長) :- findmax([N,X],(sub_atom(Atom1,0,N,_,X),sub_atom(Atom2,0,N,_,X)),L), max(L,[_先頭からの共通文字列長さ,_]). strncmp(Atom1,Atom2,N,Op) :- sub_atom(Atom1,0,N,_,Atom1_1), sub_atom(Atom2,0,N,_,Atom2_1), compare(Op,Atom1_1,Atom2_1). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # あかさ # いきし # うくす # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す'(_テキストファイル,_別のテキストファイル) :- 'テキストファイルから文字列5行を読み込み、'(_テキストファイル,LL), '別のテキストへ縦書きで書き出す'(_別のテキストファイル,LL), 'テキストファイルから文字列5行を読み込み、'(_テキストファイル,_行文字ならびのならび) :- open(_テキストファイル,read,Instream), 文字列を5行読み込み(Instream,_行文字ならびのならび), close(Instream). 文字列を5行読み込み(Instream,_行文字ならびのならび) :- findall(_行文字ならび,( between(1,5,N), get_line(Instream,_行文字列), atom_chars(_行文字列,_行文字ならび)), _行文字ならびのならび). 別のテキストファイルへ縦書きで書き出す(_別のテキストファイル,_行文字ならびのならび) :- 別のテキストファイルへ(_別のテキストファイル,Outstream), 縦書きで(_行文字ならびのならび,_縦書き), 書き出す(Outstream,_縦書き). 別のテキストファイルへ(Outfile,Outstream) :- open(_別のテキストファイル,write,Outstream). 縦書きで(_行文字ならびのならび,_縦書き) :- 最長の行文字数(_行文字ならびのならび,_最長の行文字数), 空白文字を付加して行の文字数一致させる(_最長の行文字数,_行文字ならびのならび,_空白を付加し長さを揃えた行文字ならびのならび), 行列の転置(_空白を付加し長さを揃えた行文字ならびのならび,_縦書き). 最長の行文字数(_行文字ならびのならび,_最長の行文字数) :- findmax(_行の文字数,( member(_行文字ならび,_行文字ならびのならび), length(_行文字ならび,_行の文字数)), _最長の行文字数). 空白文字を付加して文字数を一致させる(_最長の行文字数,_行文字ならびのならび,_空白を付加し長さを揃えた行文字ならびのならび) :- findall(_空白を付加し長さを揃えた文字ならび,( member(_行文字ならび,_行文字ならびのならび), length(_空白を付加し長さを揃えた行文字ならび,_最長の行文字数), append(_行文字ならび,_空白を付加し長さを揃えた行文字ならび,_空白を付加し長さを揃えた行文字ならび), all(L2,' ')), _空白を付加し長さを揃えた行文字ならびのならび). 書き出す(Outstream,[]) :- close(Outstream). 書き出す(Outstream,[_行文字ならび|R]) :- atomic_list_concat(_行文字ならび,_行文字列), format(Outstream,'~w\n',[_行文字列]), 書き出す(Outstream,R). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す(InFile,OutFile) :- open(InFile,read,Input), open(OutFile,write,Output), findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL), findmax(Len,length(Chars,Len),Max), 空白文字を付加して文字数一致させる(Max,LL,LL2), 行列の転置(LL2,LL3), 右書き用に反転して出力ファイルに書き出す(Output,LL3). 右書き用に反転して出力ファイルに書き出す(Output,[]) :- close(Output),!. 右書き用に反転して出力ファイルに書き出す(Output,[L|R]) :- reverse(L,L1), concat_atom(L1,S), write_formatted(Output,'%t\n',[S]), 右書き用に反転して出力ファイルに書き出す(Output,R). 空白文字を付加して文字数を一致させる(Max,LL1,LL2) :- findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは % % ユーザインターフェイス述語は findmax/3 です。 % % findmax/3 は集約述語である。findall/3の感覚で第一引数に指定した項の最大値を第三引数に得る。 % % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmax / 5 *** findmax([],P,V,P,V) :- !. findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :- number(V), number(V1), !, V >= V1, findmax(R1,P,V,_最大項,_最大値). findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :- number(V), number(V1), !, V < V1, findmax(R1,P1,V1,_最大項,_最大値). findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :- V @>= V1, findmax(R1,P,V,_最大項,_最大値). findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :- V @< V1, findmax(R1,P1,V1,_最大項,_最大値). % *** user: findmax / 4 *** findmax(_集約項,_項,_最大項,_最大値) :- findall([_項,_集約項],_項,_値ならび), _値ならび = [[P,V]|R], findmax(_値ならび,P,V,_最大項,_最大値). % *** user: max / 2 *** max([A|R],X) :- max_1(R,A,X) . % *** user: max_1 / 3 *** max_1([],X,X) :- !. max_1([A|R],B,X) :- A @> B, !, max_1(R,A,X). max_1([_|R],A,X) :- max_1(R,A,X).