このディレクトリの索引

% 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1268699491/516 # # 文字列をひっくり返す関数下さい # # in→あいうえお # out→おえうあい # # こんな感じのです # # # 文字列をひっくり返す関数下さい (_in,_out) :- 勘違い(おえうあい,おえういあ), atom_chars(_in,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_out,_反転した文字ならび). 文字列をひっくり返す関数下さい (_in,_out) :- 深淵なるルール(_in,_out). 勘違い(あえうあい,おえういあ). 深淵なるルール(_in,_out) :- 深遠なるルール(_in,_out). 深遠なるルール(_in,_out) :- atom_chars(_in,Chars), 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2), atom_chars(_out,Chars2). 深遠なるルール(_in,_out) :- atom_chars(_in,_文字ならび), 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび), atom_chars(_out,_一旦反転して最終二要素を置換した文字ならび). 深遠なるルール(_in,_out) :- atom_chars(_in,_文字ならび), 文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび), atom_chars(_out,_置換された文字ならび). 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :- length(L,2), append(L,R,Chars), reverse(R,R2), append(R2,L,Chars2). 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- reverse(_文字ならび,_反転した文字ならび), append(L,[A,B],_反転した文字ならび), append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび). 文字置換ルールに従って文字を置換する([],[]) :- !. 文字置換ルールに従って文字を置換する([A|R1],[B|R2]) :- 文字置換ルール(A,B), 文字置換ルールに従って文字を置換する(R1,R2). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは # 出典:: 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://pc11.2ch.net/test/read.cgi/db/1252492296/960 # # ID|A|B|C| # --------- # 1 |1|2|3| # 2 |3|4|5| # 3 |7|8|9| (テーブルFOO) # # select FOO.ID,FOO.C from FOO,(select 1 AS EXPR) AS A # where FOO.A = A.EXPR or FOO.B = A.EXPR or FOO.C = A.EXPR; # # こんなかんじで得たCの内容を1のところにセットして # 該当するIDとCを全てリストアップするSQLはどう書けばよいでしょうか? # MySQL 5.0.67です。ストアドの作成権限はないです。 # # 'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C) :-     'FOO'(ID,A,B,C),     '1のところをCの値に置換'(A,B,C,A1,B1). '1のところをCの値に置換'(A,B,1,A,B) :- !. '1のところをCの値に置換'(1,1,C,C,C) :- !. '1のところをCの値に置換'(1,B,C,C,B) :- !. '1のところをCの値に置換'(A,1,C,A,C) :- !. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C) :-     'FOO'(ID,A,B,C),     '1のところをCの値に置換'(A,B,C,A1,B1). '1のところをCの値に置換'(A,B,1,A,B) :- !. '1のところをCの値に置換'(1,B,C,C,B1) :- '1のところをCの値に置換の一'(C,B,C,C,B1),!. '1のところをCの値に置換'(A,1,C,A1,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C),!. '1のところをCの値に置換の一'(1,B,C,C,B1) :- '1のところをCの値に置換の一'(C,B,C,C,B1),!. '1のところをCの値に置換の一'(A,1,C,A1,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C),!. '1のところをCの値に置換の一'(A,B,C,A,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/976 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10619.txt # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10620.txt # # 「三目並べのプログラムを作る」 # 2人のプレーヤーが1台のパソコンの前に座り、交互に(○、×)を置いてい<。 # 次にどこに置<かは3×3の配列内の行と列を表す数字(座標)を順に入力して # 行<。○と×を置くたびに、3個並んだかを調べる。そして、縦、横、斜め方向 # のいずれかに先に3個並んだ方が勝ちとして、結果を表示する。このような要求 # を満たすような、2人で3目並べをするプログラムを作りなさい。 三目ならべ :- 三目ならべ(○,[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]). 三目ならべ(_手番,LL) :- 勝ちパターン(LL), write_formatted('%tの勝ちです\n',[_手番]),!. 三目ならべ(_手番,LL) :- flat(LL,L), \+(member(' ',L)), write('引き分けです\n'),!. 三目ならべ(○,LL) :- 次の着手(×,_行,_列), list_nth(_行,LL,L2), list_nth(_列,L1,' '), ならびの位置指定置換(_列,×,L1,L2). ならびの位置指定置換(_行,L2,LL,LL2), 三目ならべ(×,LL2). 三目ならべ(×,LL) :- 次の着手(○,_行,_列), list_nth(_行,LL,L1), list_nth(_列,L1,' '), ならびの位置指定置換(_列,○,L1,L2), ならびの位置指定置換(_行,L2,LL,LL2), 三目ならべ(○,LL2). 次の着手(_手番,_行,_列) :- repeat, write_formatted('%tの手番です。行,列を入力してください : ',[_手番]), get_line(Line), split(Line,[' ',','],[_行,_列]),!. 勝ちパターン([[○,○,○],_,_]). 勝ちパターン([_,[○,○,○],_]). 勝ちパターン([_,_,[○,○,○]). 勝ちパターン([[○,_,_],[○,_,_],[○,_,_]]). 勝ちパターン([[_,○,_],[_,○,_],[_,○,_]]). 勝ちパターン([[_,_,○],[_,_,○],[_,_,○]]). 勝ちパターン([[○,_,_],[_,○,_],[_,_,○]]). 勝ちパターン([[_,_,○],[_,○,_],[○,_,_]]). 勝ちパターン([[×,×,×],_,_]). 勝ちパターン([_,[×,×,×],_]). 勝ちパターン([_,_,[×,×,×]). 勝ちパターン([[×,_,_],[×,_,_],[×,_,_]]). 勝ちパターン([[_,×,_],[_,×,_],[_,×,_]]). 勝ちパターン([[_,_,×],[_,_,×],[_,_,×]]). 勝ちパターン([[×,_,_],[_,×,_],[_,_,×]]). 勝ちパターン([[_,_,×],[_,×,_],[×,_,_]]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/989 # # [1] 授業単元:プログラミング演習 # [2] 問題文 : # 1.テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ # 2.テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ # 'テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ' :- get_lines('file.txt',Lines), findall(Line2,(member(Line,Lines),replace_all(Line,good,bad,Line2)),Lines2), put_lines('filea.txt',Lines2). 'テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ' :- get_lines('file.txt',Lines), findall([_文字数,_行],(member(_行,Lines),sub_atom(_行,_,_文字数,_,_行)),L1), sort(L1,L2), 第二要素だけ選択してならびを反転する(L2,[],L3), put_lines('fileb.txt',L3). 第二要素だけ選択してならびを反転する([],L,L) :- !. 第二要素だけ選択してならびを反転する([[_,A|_]|R1],L1,L) :- 第二要素だけ選択してならびを反転する(R1,[A|L1],L). replace_all('',_,_,[]) :- !. replace_all(Atom,Subatom,R_atom,[R_atom|R]) :- sub_atom(Atom,0,Len,Len3,Subatom), sub_atom(Atom(Len,Len3,_,Atom2), replace_all(Atom2,Subatom,R_atom,R),!. replace_all(Atom,Subatom,R_atom,[Atom1,R_atom|R]) :- sub_atom(Atom,_,_,_,Atom1,Subatom,Atom2,_,_,_), replace_all(Atom2,Subatom,R_atom,R),!. replace_all(Atom,_,_,[Atom]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/43 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10627.txt # 問題:2人のプレーヤーが1台のパソコンの前に座って、五目並べをするプログラムを # 次のステップ([1]〜[4])に従って作成しなさい。 # # [step1]'十','−’,'|’などの文字を使って五目並べをするための10行10列の格子枠をキャラク #    タモードで表示する。関数化(関数名waku)しておく。(注意:この格子枠を表示するのが #    難しければ、列を表す最上端の数字1〜1Oと、各行の左端に行を現す数字1〜10を表示 #    すること) # 1 2 ・・・・・10 # +−−−+−−−+・・・ # 1 | # + # 2 | # ・ #  ・ # 10 # [step2]メイン関数で”Aさん次の手を入力しなさい”とモニタに表示し、次の手を3_4↓のよ #   うに入力する。入力データを引数で関数wakuに渡し、関数側で格子枠の3行目4列目に’A’ #   を埋め込み,[step 1 ]で作成した格子枠とともに表示する。 #                3   4 # ・    ・   ・  #           ・  +−−−+−−−+ #           3 | | B | #             +−−−+−−−+ # # # [step3]AさんとBさんが交互に次の手を入力しながら、Aさんの手は'A'を、Bさんの手は'B'を #  枠内に埋め込み格子枠とともに表示する。この時、既に打たれた枠に入力した場合は再度入力 #  を促すようにする。 # [step4]更に、AさんとBさんが次の手を打つ毎に、そのデータを5個並んだか調べる関数(関数 #  名narabi)に渡し、縦、横、斜め方向に5個並んでいるか調べ、結果をメイン関数に返す。 5 #  個並んでいたらメイン関数側で”Aさんの勝ぢまたぱBさんの勝ぢと表示する。並んで #  いなければゲームを続ける。 # # 質問1 # :このプログラムは人間同士がディスプレイを単なる碁盤として使用し、五目並べを行う # プログラムである。このプログラムを修正して人間とコンピュータが対戦するようにするに # はどのような改良を加えなければならないか、考えて答えなさい。 初期盤面[ [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']]. 五目並べ :- 初期盤面(_盤面), 五目並べ(A,_盤面). 五目並べ(A,_盤面) :- 次の手を入力する(A,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(A,_行,_列,_更新された盤面). 五目並べ(B,_盤面) :- 次の手を入力する(B,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(B,_行,_列,_更新された盤面). 五目並べ評価(_棋士,_盤面) :- 五目並べ完成(_棋士,_行,_列,_盤面), write_formatted('%tさんの勝ちです!\n',[_棋士]),!. 五目並べ評価(A,_,_,_盤面) :- 五目並べ(B,_盤面),!. 五目並べ評価(B,_,_,_盤面) :- 五目並べ(A,_盤面),!. 五目並べ完成(_棋士,_行,_列,_盤面) :- 五目並んだ状態とは(_棋士,_五目並んだ状態), 五目並んでいる(_五目並んだ状態,_行,_列,_盤面),!. 五目並んでいる(_五目並んだ状態,_行,_列,_盤面) :- 五目(_行,_列,L), findall(X,(member((A,B),L),I is A,J is B,list_nth(I,_盤面,L1),list_nth(J,L1,X)),_五目並んだ状態),!. 五目(_行,_列,[(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3),(_行-4,_列+4)]). 五目(_行,_列,[(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3)]). 五目(_行,_列,[(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2)]). 五目(_行,_列,[(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1)]). 五目(_行,_列,[(_行+4,_列-4),(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3),(_行+4,_列+4)]). 五目(_行,_列,[(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3)]). 五目(_行,_列,[(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2)]). 五目(_行,_列,[(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1)]). 五目(_行,_列,[(_行-4,_列-4),(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列),(_行+4,_列)]). 五目(_行,_列,[(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列)]). 五目(_行,_列,[(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列)]). 五目(_行,_列,[(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列)]). 五目(_行,_列,[(_行-4,_列),(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3),(_行,_列+4)]). 五目(_行,_列,[(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3)]). 五目(_行,_列,[(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2)]). 五目(_行,_列,[(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1)]). 五目(_行,_列,[(_行,_列-4),(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列)]). 五目並んだ状態とは(_棋士,[_棋士,_棋士,_棋士,_棋士,_棋士]). 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write_formatted('%tさん次の手を入力しなさい : ',[_棋士]), get_split_line([' '],[_行,_列]), 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面),!. 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write('その手は既に石があり打てませんもう一度入力してください\n'), 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面). 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面) :- list_nth(_行,_盤面,L), 要素番号によるならびの置換(_列,_棋士,L,L1), 要素番号によるならびの置換(_行,L1,_盤面,_更新された盤面),!. 五目並べ盤面表示(_盤面) :- 五目並べ横罫, 五目並べ表示(1,_盤面),!. 五目並べ横罫 :- write('  +−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+\n'). 五目並べ表示(_,[]) :- !. 五目並べ表示(N,[_行|R]) :- 半角全角数字変換(N,NS), write_formatted('%t',[NS]), 五目並べ行表示(_行), 五目並べ横罫, N2 is N + 1, 五目並べ表示(N2,R). 五目並べ行表示([]) :- write('|\n'),!. 五目並べ行表示([A|R]) :- write('| %t ',[A]),五目並べ行表示(R). 半角全角数字変換(1,' 1'). 半角全角数字変換(2,' 2'). 半角全角数字変換(3,' 3'). 半角全角数字変換(4,' 4'). 半角全角数字変換(5,' 5'). 半角全角数字変換(6,' 6'). 半角全角数字変換(7,' 7'). 半角全角数字変換(8,' 8'). 半角全角数字変換(9,' 9'). 半角全角数字変換(10,'10'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/284 # # [1] 授業単元:プログラム演習A # [2] 問題文:全30件の成績(0〜100点)をキーボードから # 読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点 の # 11通りの区間にそれぞれ何人が入るかを調べなさい。 # ただし、各区間に入る人数を溜めておく入れ物として # 配列を利用すること。更に調べた人数に従って、各区間を # ヒストグラムで表しなさい。 # # 0点:*** # 10点:***** # 20点:**** # ・ # ・ # 100点:* # # '全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか調べヒストグラムで表わす' :- '全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(X), ヒストグラムで表わす(X). '全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(X) :- '全30件の成績(0〜100点)をキーボードから読み込み、'(L), '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(L,[[],[],[],[],[],[],[],[],[],[],[]],X),!. '全30件の成績(0〜100点)をキーボードから読み込み、'(L) :- findall(_点数,(for(1,N,30),write_formatted('第%t件目を入力してください : ',[N]),get_integer(_点数)),L). '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'([],L,L) :- !. '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'([_点数|R],L1,L) :- _要素位置 is _点数 // 10 + 1, '区間のならびに*を追加'(_要素位置,L1,L2), '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(R,L2,L). '区間のならびに*を追加'(_要素位置,L1,L2) :- list_nth(_要素位置,L1,L), 要素番号によるならびの置換(_要素位置,[*|L],L1,L2). ヒストグラムで表わす(X) :- append(L0,[L|R],X), length(L0,N), N2 is N * 10, concat_atom(L,S), write_formatted('%t点 : %t\n',[N2,S]), R = [],!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/453 # # # [1] 授業単元: 上級プログラミング # [2] 問題文(含コード&リンク): # # 1、VisualC++2008のWindowsフォームアプリケーションのプロジェクトを作成し、DataGridViewを作成なさい。列は # A,B,C の3列とする。 # 2、列Aに入力された4桁の数値を日付形式に変換し表示する様にしなさい(○月○日)。 # 3、sample.txtの内容を読み取り、その内容を使って列Bにオートコンプリートを実装しなさい。 # # sample.txtの内容は # あいうえお # abcde # 12345 # と言う様に、1行に1単語とする。 # # 列Bの入力(_行,2,X,LL1,LL2) :- rawmode, get_char(Char), 検査(Char,[],L), atom_chars(X,L) 要素位置による行列の置換(_行,2,X,LL1,LL2), 検査('\n',L,L) :- assertz(入力補助情報('B',L)),!. 検査(Char,L1,L) :- append(L1,[Char],L2), findall(L,(append(L1,[Char|R],LX),入力補助情報('B',LX)),_入力補助), 入力補助選択(L,_入力補助),!. 検査(Char,L1,L) :- append(L1,[Char],L2), get_char(Char2), 検査(Char2,L2,L). 列Bに入力補助初期情報を与える :- get_lines('sample.txt',Lines), member(Line,Lines), atom_chars(Line,Chars), assertz(入力補助情報('B',Chars)), fail. 列Bに入力補助初期情報を与える. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/695 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク):2次元配列を使って2点を結ぶ線分を引くプログラムを書く # '2次元配列を使って2点を結ぶ線分を引く'(M1,M2,X1,X2,Y1,Y2,LL) :- '2次元配列を生成'(M1,M2,LL), A is (X2-X1) / (Y2-Y1), B is Y1 - A * X1, for(X1,X,X2), Y is truncate(A * X + B), Xp is X + 1,Yp is Y + 1, '2次元配列を要素位置指定により置換'(Yp,Xp,LL,'*'), X = X2. '2次元配列を生成'(M1,M2,LL) :- findall(L,(for(1,M,M1),list_lenth(L,M2),all(L,' ')),LL),!. '2次元配列を要素位置指定により置換'(M,N,A,LL1,LL2) :- list_nth(M,LL,L), 要素番号によるならびの置換(N,A,L,L1), 要素番号によるならびの置換(M,L1,LL,LL2). 要素番号によるならびの置換(E,E,U,[A|R],[U|R]) :- !. 要素番号によるならびの置換(S1,E,U,[A|R],[A|R1]) :- S2 is S1 + 1,要素番号によるならびの置換(S2,E,U,R,R1). 要素番号によるならびの置換(Pos,U,L1,L2) :- 要素番号によるならびの置換(1,Pos,U,L1,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/863 # # [2]問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10697.txt # [2]問題文:10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、 # 実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示するプログラムを書け #  点数は1~100の乱数によって与えること。 # また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する。 #  格納し終えたのち、1次的配列の先頭から合計点を表示する。 #  一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する。 #  ソートの方法として、バブルソースを使用する # <<実行例>> (seed=97の場合) # 国語 数学 英語 # 1人目: 75 55 84 # 2人目: 3 58 90 # 3人目: 100 60 61 # 4人目: 19 39 67 # 5人目: 90 99 15 # 6人目: 5 58 59 # 7人目: 20 15 47 # 8人目: 46 12 94 # 9人目: 22 93 27 # 10人目: 90 90 35 # # 合計点(ソート前): 214 151 221 125 204 122 82 152 142 215 # 合計点(ソート後): 221 215 214 204 152 151 142 125 122 82 図と同じASCII文字を表示する :- findall(N,for(32,N,123),L), 'N個組'(4,L,L1), append(_,[[N1,N2,N3,N4]|R],L1), 'N進数'(16,N1,S1), 'N進数'(16,N2,S2), 'N進数'(16,N3,S3), 'N進数'(16,N4,S4), write_formatted('%1s0x%2s;%2d%10s0x2sd;%2d%10s0x%2s;2d%10s0x%2s;2d\n',[S1,N1,S2,N2,S3,N3,S4,N4]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% スペースを圧縮してスペース以外の要素はQに置換する([],Q,[]). スペースを圧縮してスペース以外の要素はQに置換する([' '|R1],Q,[P|R2]) :- スペースならびを切り取る([' '|R1],L1,R), スペース圧縮表現(L1,P), スペースを圧縮してスペース以外の要素はQに置換する(R,Q,R2),!. スペースを圧縮してスペース以外の要素はQに置換する([A|R1],Q,[Q|R2]) :- スペースを圧縮してスペース以外の要素はQに置換する(R1,Q,R2). スペースならびを切り取る([],[],[]) :- !. スペースならびを切り取る([A|R1],[],[A|R1]) :- \+(A = ' '),!. スペースならびを切り取る([' '|R1],[' '|R2],R) :- スペースならびを切り取る(R1,R2,R). スペース圧縮表現([],'') :- !. スペース圧縮表現(L,S) :- length(L,Len), concat_atom(['%',Len,s],S). % 以下のサイトは # 出典:: 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://pc12.2ch.net/test/read.cgi/tech/1274121477/320 # # 日本語文章中の複数の単語を置換したいです。 # ファイルは一つのディレクトリに複数あります。 # >http://ime.nu/www.machu.jp/diary/20070224.html#p01 # ファイル検索はcygwin かlinux上なので上記を参考にしています。 # trではうまくいきませんでした。 # # お題 # # 拡張子が .rb の全てのファイルに対して、 # # #!/usr/bin/env ruby # # を # # #!/usr/local/bin/ruby # # に置換する。ついでに、「ruby」という文字を「perl」に置き換える '拡張子が .rb の全てのファイルに対して、#!/usr/bin/env ruby を #!/usr/local/bin/ruby に置換する。ついでに、「ruby」という文字を「perl」に置き換える' :- shs('ls -N *.cs',Files), append(_,[File|R],Files), get_lines(File,Lines), 指定された内容に文字列を置換する(Lines,Lines2), put_lines(File,Lines2), R = []. 指定された内容に文字列を置換する([],[]) :- !. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- sub_atom(Line,_,_,_,A1,'#!/usr/bin/env ruby',A3,L1,L2,L3), concat_atom([A1,'#!/usr/local/bin/ruby',A3],Line1), rubyをperlに置換する(Line1,Line2), 指定された内容に文字列を置換する(R1,R2),!. 指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :- rubyをperlに置換する(Line,Line2), 指定された内容に文字列を置換する(R1,R2). rubyをperlに置換する(Line,Line2) :- replace_all(Line,ruby,perl,Line2). % replace_all/3は http://nojiriko.asia/prolog/replace_atom.html 参照 % 以下のサイトは # c137 #534 # [1] 授業単元: Visual Studio 入門 # [2] 問題 半乱順列の関数作成 # :- op(300,xf,回). :- op(700,xf,切る). 半乱順列の作成(_置換指定,_対象ならび,_半乱順列ならび) :- 整列(_対象ならび,_整列したならび), 整列したならび乱す(_置換指定,_整列したならび,_半乱順列ならび). 整列したならび乱す(最初と最後の要素を入れ替える,L1,L2) :- '最初と最後の要素を入れ替えて、整列したならびを乱す'(L1,L2). 整列したならびを乱す(N 回 切る,L1,L2) :- 'N回切って、整列したならびを乱す'(N,L1,L2). 整列したならびを乱す([[N1,N2]|R],L1,L2) :- '入れ替え位置指定ならびから、整列したならびを乱す'([[N1,N2]|R],L1,L2). '最初と最後の要素を入れ替えて、整列したならびを乱す'(L1,L2) :- [A|R]=L3, append(L4,[B],R), append([B|L4],[A],L2),!. 'N回切って、整列したならびを乱す'(0,L,L) :- !. 'N回切って、整列したならびを乱す'(N,L1,L2) :- 入れ替え位置を得る(L1,N1,N2), ならびの交換(N1,N2,L1,L3), succ(N1,N), 'N回切って、整列したならびを乱す'(N1,L1,L2). 入れ替え位置を得る(L1,N1,N2) :- length(L1,Len), N1 is random mod Len, N2 is random mod Len. '入れ替え位置指定ならびから、整列したならびを乱す'([],L,L) :- !. '入れ替え位置指定ならびから、整列したならびを乱す'([[N1,N2]|R],L1,L2) :- ならびの交換(N1,N2,L1,L3), '入れ替え位置指定ならびから、整列したならびを乱す'(R,L3,L2). ならびの交換(M,N,_対象ならび,_交換したならび) :- 'M番目の要素と前後'(M,L1,A,R1), 'N番目の要素と前後'(N,L2,B,R2), 要素を入れ替えながらならびの再構成(L1,A,R1,L2,B,R2). 'M番目の要素と前後'(M,L1,A,R1) :- M1 is M - 1, append(L1,[A|R1],_対象ならび), length(L1,M1),!. 'N番目の要素と前後'(N,L2,B,R2) :- N1 is N - 1, append(L2,[B|R2],_対象ならび), length(L2,N1),!. 要素を入れ替えながらならびの再構成(L1,A,R1,L2,B,R2) :- append(L1,[B|R1],L3), append(L4,[_|R3],L3), length(L4,N1), append(L4,[A|R3],_交換したならび),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/602 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10791.txt # 問題文 # # 0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。 # この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。 # このような組合せを列挙し、何通りあるかを、C言語のプログラムで求める。何通りあるかは、数学的に解いて確認せよ。 # 例題プログラムEnumFull.c を修正する。 # # 部分問題への分解 0が現れる枚数で場合分けして、それぞれの個数を集計 # 弱化問題への緩和 0および6と7に関する条件を無視して、とりあえず全てを列挙し、題意に合わないものを排除 # 等価問題への還元 2枚の0を、0と8に読み換え、8は単独で選ばないという条件に置換 # 7は外して列挙し、6が現れる場合に、7に読み換えたものも追加 '0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(U) :- findall(L,( 組み合わせ([0,0,1,2,3,4,5,6,7],4,L), 許される組み合わせ(L)), X), sort(X,Y), append(_[U|R],Y). 許される組み合わせ(A) :- append(_[6|_],A),append(_,[7|_],A),!,fail. 許される組み合わせ(A) :- append(B,[0|C],A),append(D,[0|E],C),!,fail. 許される組み合わせ(A). '0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙し何通りあるか'(_何通り) :- count('0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(_),_何通り). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/630 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # # 概要:数値を1つ(2〜9の数字)入力し、その個数分の"*"を1辺とする # 完成図(*=★、空白=☆): # # 3を入力した場合 # ★★★ # ☆☆★ # ★★★ # # 9を入力した場合 # ★★★★★★★★★ # ☆☆☆☆☆☆☆☆★ # ★★★★★★★☆★ # ★☆☆☆☆☆★☆★ # ★☆★★★☆★☆★ # ★☆★☆☆☆★☆★ # ★☆★★★★★☆★ # ★☆☆☆☆☆☆☆★ # ★★★★★★★★★ '数値を1つ(2〜9の数字)入力し、その個数分の"*"を1辺とする'(_数値,LL) :- findall(L1,(for(1,_,_数値),length(L1,_数値)),LL), とぐろを巻く(1,1,_列数1,,LL). とぐろを巻く(_行,_列,_行5,_列5,LL) :- 右に進む(_行,_列,_行2,_列2,LL), 置換(LL,LL1), 進む(_列2,_行2,_列3,_行3,LL2), 左に進む(_行3,_列3,_行4,_列4,LL3), 上に進む(_行4,_列4,_行5,_列5,LL4). 進む(_行,_列,_行2,_列2,LL), nth1(_行,LL,L), 右に進む(L). length([_|L0],_列), append(L0,[★,B|R,L), var(A), var(B), _列数1 is _列数 + 1, 進む(_列1,_列数1,L). 進む(L,_列1,_列2) :- _列2 is _列1 + 1, length(L0,_列1), append(L0,[A|R],L),!. 進むの一(A,R),!. 進むの一(A,[B|R]) :- \+(var(B)),!,fail. 進むの一(A,[B|R]) :- var(B), A = ★,!. 進むの一(A,[]) :- \+(var(A)), A = ★,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1262163854/238 # # Repl-Aceというテキスト置換ツールを使っているんですが、 # # 1月 # ・1日 # ・2日 # ・3日 # 2月 # ・1日 # ・2日 # ・3日 # # といったテキストを、 # # 1月1日 # 1月2日 # 1月3日 # 2月1日 # 2月2日 # 2月3日 # # といったように置換することができず困っています。 # 単純な文字の置換や簡単な正規表現は理解できるのですが、 # 1月から2月までの「・」を「1月」に置換、2月から3月までの「・」を「2月」に置換、3月から(ry # を一気に行えるような正規表現ってありますか? # Repl-Aceで試すのは自力でやるので、一般的な記述方法があれば教えてください。 # おながいします。 # 月日の構造表現を平坦な月日に置換(InputTextFile,OutputTextFile) :- get_lines(InputTextFile,Lines), 平坦な月日に置換(Lines,L), put_lines(OutputTextFile,L). 平坦な月日に置換([],[]) :- !. 平坦な月日に置換([_月|R1],L) :- \+(sub_atom(_月,0,1,_,'.')), 平坦な月日に置換(_月,R1,R2,L1), 平坦な月日に置換(R2,L2), append(L1,L2,L). 平坦な月日に置換(_,[],[],[]) :- !. 平坦な月日に置換(_,[_月|R1],[_月|R1],[]) :- \+(sub_atom(_月,0,1,_,'.')),!. 平坦な月日に置換(_月,[A|R1],R,[C|R2]) :- sub_atom(A,1,_,0,B), concat_atom([_月,B],C), 平坦な月日に置換(_月,R1,R,R2),!. % 以下のサイトは # 出典:: 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://hibari.2ch.net/test/read.cgi/tech/1284632294/921 # # 質問にきましたお邪魔します。 # [1] Cプログラミング # [2] 問題文(含コード&リンク): 数問あるのでリンクからお願いします。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10941.txt # # 問5.ある地点a , b, cの12:00、0:00までの各12時間の降水量[mm]を以下のような表形式で、各時刻の降水量、平均降水量 # を画面に表示するプログラム。 # \t タブを用いて列をあわせ、数値は小数点以下一桁にすること。 # stateの欄は各地点の合計降水量が10[mm]未満の場合は「雨」、10[mm]以上の場合は「大雨」と表示する。 # # a b c Average # 0:00 1.0 2.5 1.5 1.6 # 12:00 11.0 5.5 15.0 10.5 # state 大雨 雨 大雨 # 'ある地点a , b, cの12:00、0:00までの各12時間の降水量[mm]を以下のような表形式で、各時刻の降水量、平均降水量を画面表示' :- findall([_時刻,_aの降水量,_bの降水量,_cの降水量],( append(_,[_時刻|R],[12:00,13:00,14:00,15:00,16:00,17:00,18:00,19:00,20:00,21:00,22:00,23:00,0:00]), 降水量(a,_時刻,_aの降水量), 降水量(b,_時刻,_bの降水量), 降水量(c,_時刻,_cの降水量)), LL1), 時刻を取り除く(LL1,LL2), 各行の平均を得る(LL2,_各行の平均ならび), 置換(LL1,LL3), 加算(LL3,_各列の合計ならび), 雨量判定(_各列の合計ならび,_雨量判定ならび), 降水量の表示(LL1,_各行の平均ならび,_雨量判定ならび),!. 時刻を取り除く([],[]) :- !. 時刻を取り除く([[_|L]|R1],[L|R2]) :- 時刻を取り除く(R1,R2). 各行の平均を得る([],[]) :- !. 各行の平均を得る([_行|R1],[_平均|R2]) :- avg(_行,_平均), 各行の平均を得る(R1,R2). 雨量判定([],[]) :- !. 雨量判定([V|R1],[大雨|R2]) :- V >= 10.0, 雨量判定(R1,R2),!. 雨量判定([V|R1],[雨|R2]) :- V < 10.0, 雨量判定(R1,R2),!. 降水量の表示([],[],_雨量判定ならび) :- write_formatted('state,%.1f.1f,%.1f,%.1f\n',_雨量判定ならび),!. 降水量の表示([L|R1],[_行平均|R2],_雨量判定ならび) :- append(L,_行平均,L2), write_formatted('%.1f.1f,%.1f,%.1f\n',L2), 降水量の表示(R1,R2,_雨量判定ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/572 # # ●正規表現の使用環境 # php5 # # ●検索か置換か? # 置換 # # ●説明 # tableタグ内の改行(<br />)を全て削除したい # # ●対象データ # <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br /> # <tbody><br /> # <tr><br /> # <td><br /> # </td><br /> # </tr><br /> # </tbody><br /> # </table> # # ●希望する結果 # <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"> # <tbody> # <tr> # <td> # </td> # </tr> # </tbody> # </table> # # 'tableタグ内の改行タグを全て削除したい'(_ファイル) :- get_chars(_ファイル,Chars), 'tableタグ内の改行タグを全て削除したい'(Chars,L), put_chars(_ファイル,L). 'tableタグ内の改行タグを全て削除したい'([],[]) :- !. 'tableタグ内の改行タグを全て削除したい'(L1,L2) :- append(L0,[<,t,a,b,l,e,>|R],L1), append(L2,[<,/,t,a,b,l,e,>|R2],R), '改行タグの削除'(L2,L3), 'tableタグ内の改行タグを全て削除したい'(R2,L4), append(L0,[<,t,a,b,l,e,>|L3],L4,L2),!. 'tableタグ内の改行タグを全て削除したい'(L,L). '改行タグの削除'([],[<,/,t,a,b,l,e,>]) :- !. '改行タグの削除'([<,b,r,' ',/,>|R1],R2) :- '改行タグの削除'(R1,R2),!. '改行タグの削除'([A|R1],[A|R2]) :- '改行タグの削除'(R1,R2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/579 # # 見出しと任意文字列の間にtabを挿入したいのですが、そうした置換は可能でしょうか? # サクラエディタを使っています。 # 幼稚な質問をお許し下さい # # # 見出し1=任意文字列1 # 見出し2=任意文字列2=任意文字列3 # 見出し3=任意文字列4=任意文字列5=任意文字列6 # # 【こうしたい】 # 見出し1=  任意文字列1 # 見出し2=  任意文字列2=任意文字列3 # 見出し3=  任意文字列4=任意文字列5=任意文字列6 # # # # # # 見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :- findall(_tabを挿入された行,( append(_,[_行|_],_対象となる行ならび), 文字列置換(_行,'=','=\t',_tabを挿入された行)), _見出しと任意文字列の間にtabを挿入した行ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 文字列置換/4 が未定義だったら、 見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :- findall(_tabを挿入された行,( append(_,[_行|_],_対象となる行ならび), split(_行,['='],[_見出し|R]), concat_atom(R,'=',S), concat_atom([_見出し,'=','\t',S],_tabを挿入された行)), _見出しと任意文字列の間にtabを挿入した行ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/522 # # ●正規表現の使用環境 # PHP5.29 # # ●検索か置換か? # 検索 # # ●説明 # :より前の記号部分を取得したい。 # # ●対象データ # 5789:石鹸 # w555-2:タオル # Zxcvb:ハンガー # # ●希望する結果 # 5789 # w555-2 # Zxcvb # ':より前の記号部分を取得したい。 '(_行ならび,_置換された行ならび) :- findall(_コロンより前の記号部分,( append(_,[_行|_],_行ならび), コロンより前の記号部分(_行,_コロンより前の記号部分)), _置換された行ならび). コロンより前の記号部分(_行,_コロンより前の記号部分) :- sub_atom(_行,_コロンの位置,1,_,':'), sub_atom(_行,0,_コロンの位置,_,_コロンより前の記号部分),!. % 以下のサイトは # 左横書き文書を右縦書き文書に変換してください # 左横書き文書を右縦書き文書に変換(_横書きの行ならび,_縦書きに置換された行ならび) :- 行の最大長まで空白を付加した文字ならびのならびを作る(_横書きの行ならび,_文字ならびのならび), 転置(_文字ならびのならび,_縦書き用に転置された文字ならびのならび), 右書き用に反転して文字列に戻す(_縦書き用に転置された文字ならびのならび,_縦書きに置換された行ならび),!. 行の最大長まで空白を付加した文字ならびのならびを作る(_横書きの行ならび,_文字ならびのならび) :- 行の最大長を得る(_行の最大長), 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/tech/1274998754/670 # # C++で躓いてしまいました。。 # 10行程度の文字が書かれてあるテキストファイルを開き、各行の1文字 "+" だけをを消去していく # ようなプログラミングは可能でしょうか? # 今は、foutで使用してファイルに書き込みをしているのですが、どうしても各行1文字だけを消去するというアルゴリズムのアイディアが浮かばず # 質問させて頂きました。 # よろしくお願いします。 # '10行程度の文字が書かれてあるテキストファイルを開き、各行の1文字 "+" だけをを消去していく'(_テキストファイル) :- get_lines(_テキストファイル,Lines), findall(Line2,( append(_,[Line|R],Lines), 文字列置換(Line,'+','',Line2)), Lines2), put_lines(_テキストファイル,Lines2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1287755129/11 # # 3003,aaa # 3004,bbb # 3005,ccc # ・ # ・ # こんなレコードが何百万行っていうCSVがあって、 # 1カラム目の値をキーとして、2カラム目の値を取得したいんです。 # このリクエストは1分当たりに何度も発生します。 # 当然、1カラム目の値はユニークです。 # # で、リクエストが発生するたびに、 # 単純に先頭から検索していったんじゃ、時間がかかるんで、 # このCSVをハッシュに持っておいて、 # レスポンスを返すようなデーモンを作れば、速くなるかな〜 # と考えてるんですが、方向性は合ってますかね? # #DBは使えない環境です。。。 # # ここで聞くことか迷ったんですが、 # 組むならperlで組むんで、こちらで聞いてみました。 # # よろしくお願いします。 # # 要約関数(_述語幹部,_鍵整数値,_述語名) :- _法 = 1000, _剰余 is _鍵整数値 mod _法, concat_atom([_述語名幹部,'_',_剰余],_述語名),!. '第一項をユニークな整数鍵とするCSVファイルを要約関数述語として登録'(CSVファイル,_述語名幹部) :- get_lines(CSVファイル,Lines), append(_,[Line|R],Lines), split(Line,[','],[_鍵整数値|_値ならび]), 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび), R = [],!. 要約関数述語の節として追加(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名幹部,_鍵値|_値ならび], asserta(P). 要約関数述語の節を削除(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], retract(P). 要約関数述語の検索(_述語名幹部,_鍵整数値,_値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), P =.. [_述語名,_鍵値|_値ならび], call(P). 要約関数述語の節置換(_述語名幹部,_鍵整数値,_更新する値ならび) :- 要約関数(_述語名幹部,_鍵整数値,_述語名), length(_更新する値ならび,Len), length(L,Len), P1 =.. [_述語名,_鍵値|L], retract(P1), P2 =.. [_述語名,_鍵値|_更新する値ならび], asserta(P2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/614 # # # .replace(/^(http:\/\/farm1\.static\.flickr\.com\/[^/]+\/\w+_\w+_)m(\.\w+)$/, "$1o$2") # # ↑ # のスクリプトを改変したいのですが、 # 以下の場合の正規表現をそれぞれ教えてください # # ( 1 ) # http://ime.nu/img.pics.livedoor.com/*/*/*/*-*.jpg # ↓ 「*-*.jpg」を「*-1024.jpg」に変える # http://ime.nu/img.pics.livedoor.com/*/*/*/*-1024.jpg # # ※こういうURL置換させることを目指してます # http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-M.jpg # ↓ # http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-1024.jpg # # # ( 2 ) # http://ime.nu/*.photobucket.com/*/*/*/th_*.jpg # ↓ 「th_」を削除 # http://ime.nu/*.photobucket.com/*/*/*/*.jpg # # ※こういうURL置換させることを目指してます # http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/th_alex1a.jpg # ↓ # http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/alex1a.jpg # # # ( 3 ) # http://ime.nu/*.content.foto.mail.ru/*/*/*/*-*.jpg # ↓ 「*-*.jpg」を「i-*.jpg」に変える # http://ime.nu/*.content.foto.mail.ru/*/*/*/i-*.jpg # # ※こういうURL置換させることを目指してます # http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/p-5879.jpg # ↓ # http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/i-5879.jpg # # '例えば、http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-M.jpgをhttp://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-1024.jpg に変えたい'(URL1,URL2) :- sPLIT(URL1,['/'],L), append(L1,[File],L), sPLIT(File,['.jpeg'],[A,B]), append(L1,[A,'-1024',B],L2), concat_atom(L2,URL2). '例えば、http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/th_alex1a.jpgをhttp://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/alex1a.jpg に変えたい'(URL1,URL2) :- sPLIT(URL1,['/'],L), append(L1,[File],L), sPLIT(File,['.jpeg'],[A,B]), append(L1,[alex1a,B],L2), concat_atom(L2,URL2). '例えば、http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/p-5879.jpgをhttp://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/i-5879.jpg に変えたい'(URL1,URL2) :- sPLIT(URL1,['/'],L), append(L1,[File],L), sPLIT(File,['-'],[A,'-',B]), append(L1,[i,'-',B],L2), concat_atom(L2,URL2). '例えば、http://c3.ac-images.myspacecdn.com/images02/80/m_22e6adfa8f2b4dafbf00b28a78e9db6e.jpgをhttp://c3.ac-images.myspacecdn.com/images02/80/l_22e6adfa8f2b4dafbf00b28a78e9db6e.jpg に変えたい'(UR1,URW) :- sPLIT(URL1,['/'],L), append(L1,[File],L), sPLIT(File,['_'],[A,'_',B]), append(L1,[i,'_',B],L2), concat_atom(L2,URL2). '例えば、http://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs137.snc1/5852_132531839605_775304605_3072465_7463459_s.jpgをhttp://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs137.snc1/5852_132531839605_775304605_3072465_7463459_n.jpg に変えたい'(URL1,URL2) :- sPLIT(URL1,['/'],L), append(L1,[File],L), sPLIT(File,['_','.jpeg'],L), append(L1,[_,'.jpeg'],L), append(L1,[n,'.jpeg'],L2), concat_atom(L2,URL2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/449 # # [1] 授業単元:cプログラミング # [2] 問題文(含コード&リンク): # キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形 # を表示する。なお、入力が間違っている場合、再度入力を要求する。 # ↓こんな感じ # 実行結果例 # # 数字(2〜9)を入力してください:0 # 入力エラーです!! # 数字(2〜9)を入力してください:3 #  * * *  #   #  *   * #   #  * * * # # 'キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形を表示する。なお、入力が間違っている場合、再度入力を要求する。' :- 'キーボードから数字(2〜9)を入力し、'(N), 正方形の格を変数のリストとして生成する(N,LL), 第一行を星で詰める(LL), 置換する(LL), 各行を反転しながら、変数を空白に置換して行を表示する(LL). 正方形の格を変数のリストとして生成する(N,LL) :- 星の間に空白を挿むからその分、格を拡張する(N,N2), findall(L,( for(1,_,N2), length(L,N2)), LL). 星の間に空白を挿むからその分、格を拡張する(N,N2) :- N2 is N * 2 - 1. 第一行を星で詰める([*]) :- !. 第一行を星で詰める([*,' '|R]) :- 第一行を星で詰める(R). 置換する(L) :- 置換(L,L). 各行を反転しながら、変数を空白に置換して行を表示する([]) :- !. 各行を反転しながら、変数を空白に置換して行を表示する([L|R]) :- reverse(L,L), 変数を要素を空白に置換する(L), concat_atom(L,A), write_formatted('%t\n',[A]), 各行を反転しながら、変数を空白に置換して行を表示する(R). 変数要素を空白に置換する([]) :- !. 変数要素を空白に置換する([' '|R]) :- 変数要素を空白に置換する(A,R),!. 変数要素を空白に置換する([_|R]) :- 変数要素を空白に置換する(R),!. 'キーボードから数字(2〜9)を入力し、'(N) :- write('2〜9の整数を入力してください : '), get_line(Line), 'キーボードから数字(2〜9)を入力診断'(Line,N),!. 'キーボードから数字(2〜9)を入力し、'(N) :- 'キーボードから数字(2〜9)を入力し、'(N). 'キーボードから数字(2〜9)を入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 2, N =< 9,!. 'キーボードから数字(2〜9)を入力診断'(Line,N) :- write_formatted('入力された %t は2〜9の整数ではありませんでした\n',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/449 # # [1] 授業単元:cプログラミング # [2] 問題文(含コード&リンク): # キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形 # を表示する。なお、入力が間違っている場合、再度入力を要求する。 # ↓こんな感じ # 実行結果例 # # 数字(2〜9)を入力してください:0 # 入力エラーです!! # 数字(2〜9)を入力してください:3 #  * * *  #   #  *   * #   #  * * * # # 'キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形を表示する。なお、入力が間違っている場合、再度入力を要求する。' :- 'キーボードから数字(2〜9)を入力し、'(N), 正方形の格を変数のリストとして生成する(N,LL), 第一行を星で詰める(LL), 置換する(LL), 各行を反転しながら、変数を空白に置換して行を表示する(LL). 正方形の格を変数のリストとして生成する(N,LL) :- 星の間に空白を挿むからその分、格を拡張する(N,LL), findall(L,( append(_,[L|_],LL), length(L,N)), LL). 星の間に空白を挿むからその分、格を拡張する(N,L2) :- length(L,N), append(L,L,L2), append(L,[_],L2). 第一行を星で詰める([*]) :- !. 第一行を星で詰める([*,' '|R]) :- 第一行を星で詰める(R). 置換する(L) :- 置換(L,L). 各行を反転しながら、変数を空白に置換して行を表示する([]) :- !. 各行を反転しながら、変数を空白に置換して行を表示する([L|R]) :- reverse(L,L), 変数を要素を空白に置換する(L), concat_atom(L,A), write_formatted('%t\n',[A]), 各行を反転しながら、変数を空白に置換して行を表示する(R). 変数要素を空白に置換する([]) :- !. 変数要素を空白に置換する([' '|R]) :- 変数要素を空白に置換する(R),!. 変数要素を空白に置換する([_|R]) :- 変数要素を空白に置換する(R),!. 'キーボードから数字(2〜9)を入力し、'(N) :- write('2〜9の整数を入力してください : '), get_line(Line), 'キーボードから数字(2〜9)を入力診断'(Line,N),!. 'キーボードから数字(2〜9)を入力し、'(N) :- 'キーボードから数字(2〜9)を入力し、'(N). 'キーボードから数字(2〜9)を入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 2, N =< 9,!. 'キーボードから数字(2〜9)を入力診断'(Line,N) :- write_formatted('入力された %t は2〜9の整数ではありませんでした\n',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/464 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下のような動作をするプログラムを作成せよ。 # ・main()関数の引数を用いて整数値xを与える。 # ・fgetsを用いて、標準入力(キーボード)から英単語と英文字cを与える。 # ・英単語のx番目以降の文字をcに変える関数を作って使用する。 # ・変更された英単語と整数値を使って文字列"変更された後の英単語_整数値"を作る # ・puts()またはfputs()を用いて出力 # 実行例:./a.out 5 キーボード入力:information p 実行結果(表示):infoppppppp_5 # 英単語のx番目以降の文字をcに変える :- user_parameters([Arg]), atom_to_term(Arg,_x番目,_), 英単語と文字cの入力(_英単語,_c), 英単語のx番目以降の文字をcに変える(_英単語,_x番目,_c,_変換された英単語), write_formatted('%t\n',[_変換された英単語]). 英単語と文字cの入力(_英単語,_c) :- write('英単語を入力してください : '), get_line(_英単語), write('置換する文字cを入力してください : '), get_char(_c). 英単語のx番目以降の文字をcに変える(_英単語,_x番目,_c,_変換された英単語) :- sub_atom(_英単語,0,_x番目,R,_副文字列_1), length(L,R), all(L,_c), concat_atom(L,S), concat_atom([_副文字列_1,S],_変換された英単語). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/694 # # Flexible Renamerというソフトで音楽ファイル名の検索&一括置換したいのですが、 # # 対象: aaa_bbb_01ccc.mp3 # ↓ # 結果: aaa_bbb_01_ccc.mp3 # # "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい、ということです。 # # よろしくおねがいします。 # % sub_atom/10 は http://nojiriko.asai/prolog/t264_u.html を参照 '対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_区切り直された名前) :- split(_名前,['_'],[_項1,_項2,_項3]), sub_atom(_項3,_検索位置,1,_残り文字数,H,A,T,_,_,_), \+((A@>='0',A@=<'9')), concat_atom([_項1,'_',_項2,'_',H,'_',A,T],_区切り直された名前),!. '対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_名前). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/678 # # ●正規表現の使用環境 # Devas(ディレクトリ内の再帰検索及び置換ソフトでGrep互換) # # ●検索か置換か? # 検索と置換 # # ●説明 # HTMLのaタグにonclick属性を追加,または追記したい # # ●対象データ # 数百のSmartyテンプレート # (HTMLやフレームワークのコードを含む文字列) # 単純に<a hrefで始まるものばかりではなく,<a class等で始まるものもある # # ●希望する結果 # htmlのaタグから # href="xxxxx-regist"を含んでおり, # かつonclick="xxx"含んでいる または 含んでいないものを検索,置換し # onclickにアクションを追加または追記 # # <a href="xxx-regist" onclick="追加または追記したい"> # # # # 対象ページが数百もあり,とても手作業で修正できないため正規表現の力を借りたいです # aタグはすぐにhrefで始まるものばかりではないため,以下のような正規表現を考えたのですが, # なぜか複数行に渡ってしまう結果が抽出されたりとうまくいきません # # href=".+\-regist".+?(onclick="(.+)")?.+?\n # # # ご教授いただけないでしょうか・・ # # 数百のSmartyテンプレートのonclickタグを追加または変更する(_ファイル名ならび) :- append(_,[_ファイル|R],_ファイル名ならび), 'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル), R = [],!. 'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル) :- get_chars(_ファイル,Chars), 'onclickにアクションを追加または追記'(Chars),!. 'onclickにアクションを追加または追記'(Chars) :- 'aタグを選別'(Chars,L0,R1,R2,_Atag), 'onclick要素候補'(_Atag,_onclick要素候補), 'onclick句の生成'(_onclick要素候補,_onclick句), put_chars(L0), '現在のonclick句の削除'(R1,R11), append(R11,_onclick句,R12), put_chars(['<',a,' '|R12]), put_chars(['<','/',a,'>']), 'onclickにアクションを追加または追記'(R2). 'aタグを選別'(Chars,L0,R1,R2,_Atag) :- append(L0,['<',a,' '|R1],['<','/',a,'>'|R2],Chars), \+(append(_,['<','a',' '|_],R1)), \+(append(_,['<','/',a,'>'|_],R1)), _Atag = ['<',a',' '|R1]. 'onclick要素候補'(_Atag,_onclick要素候補) :- append(L0,[h,r,e,f,'=','"'|_onclick要素候補],['-',r,e,g,i,s,t,'"'|R2],_Atag),!. 'onclick句の生成'(_onclick要素候補,_onclick句) :- append([' ',o,n,c,l,i,c,k,'=','"'|_onclick要素候補],['"',' '],_onclick句). '現在のonclick句の削除'([],[]) :- !. '現在のonclick句の削除'([' ',o,n,c,l,i,c,k,'=','"'|R1],[' '|R2]) :- append(_,['"',' '|R2],R1),!. '現在のonclick句の削除'([A|R1],[A|R2]) :- '現在のonclick句の削除'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/316 # # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 検索 # # ●説明 # [[ と ]] に囲まれた文字列を配列で取得したい # # ●対象データ # [[hare]][[ame]][[kumori]][[yuki]][[]][[kaminari]][[taifuu]] # # ●希望する結果 # matches[0] = hare # matches[1] = ame # matches[2] = kumori # matches[3] = yuki # matches[4] = # matches[5] = kaminari # matches[6] = taifuu # # よろしくお願いします。 # '[[ と ]] に囲まれた文字列をならびとして取得したい'(_文字列,L) :- atom_chars(_文字列,Chars), '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,L). '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,[_文字列1|R]) :- append(L0,['[','['|R1],[']',']'|R2],Chars), concat_atom(R1,_文字列1), '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(R2,R),!. '文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(_,[]) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/385 # # ●正規表現の使用環境 # .net Framework 2.0 - 3.5 (C#) # # ●検索か置換か? # 検索 # # ●説明 # artist, titleの各グループの文字列を取得したい # # ●対象データ # Artist - Title # # ●希望する結果 # artist = Artist # title = Title # # よろしくおねがいします。 # 'artist, titleの各グループの文字列を取得したい'(_対象データ,_希望する結果) :- split(_対象データ,[' '],L), 'artist, titleの切り出し'(L,Artist,Title), write_formatted_atom(_希望する結果,'artist = %t\ntitle = %t',[Artist,Title]). 'artist, titleの切り出し'([Artist,Title],Artist,Title) :- !. 'artist, titleの切り出し'([Artist,_,Title|_],Artist,Title) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/417 # # ●正規表現の使用環境 # 秀丸 8.0.2 b5 # # ●検索か置換か? # 検索 # # ●説明 # 条件にマッチする行を指定数だけ抽出する # # ●対象データ # a hogehoge1 # b hogehoge2 # c hogehoge3 # a hogehoge4 # a hogehoge5 # c hogehoge6 # a hogehoge7 # b hogehoge8 # # ●希望する結果 # "a " で始まる行を 3 つだけ表示させる # a hogehoge1 # a hogehoge4 # a hogehoge5 # # 宜しくお願いします。 # % % 3つだけと言う場合、3つ未満だった時どうするか。failにするなら2引数の方の第一節を削除する。 % '"a " で始まる行を 3 つだけ表示させる'(Lines) :- '"a " で始まる行を 3 つだけ表示させる'([_,_,_],Lines). '"a " で始まる行を 3 つだけ表示させる'(_,[]) :- !. '"a " で始まる行を 3 つだけ表示させる'([],_) :- !. '"a " で始まる行を 3 つだけ表示させる'([_|Ln],[Line|R]) :- sub_atom(Line,0,_,_,'a '), write_fromatted('%t\n',[Line]), '"a " で始まる行を 3 つだけ表示させる'(Ln,R),!. '"a " で始まる行を 3 つだけ表示させる'(Ln,[_|R]) :- '"a " で始まる行を 3 つだけ表示させる'(Ln,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/437 # # 使用言語はjavascript。 # 独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。 # テキスト行中にタグが複数出てくることもあり。 # # 置換前 : あいうえお <A#かきくけこ#A> さしすせそ <A#たちつてと#A> なにぬねの # # 置換後 : あいうえお さしすせそ なにぬねの # # # どうやったらいいですかあああああボスケテーーー!!! # '独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。'(_文字列,_独自のタグを取り除いた文字列) :- atom_chars(_文字列,Chars), append(L0,['<','A','#'|R1],['#','A','>'|R2],Chars), append(L0,R2,L2), concat_atom(L2,_独自のタグを取り除いた文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/467 # # ●正規表現の使用環境 # .net(C#3.0) # # ●検索か置換か? # 検索 # # ●説明 # 空白をデリミタとして、最初の文字列を取得したい # 空白は半角全角両方あり、複数連続することもあり得る # ただし、()や[]で囲まれる文字列はスルー(空白として処理する) # 正規表現一発で抜き出したいです # # 下記例の各行は全て「山田太郎」だけ抽出されるようにしたいです # # 山田太郎 39才 #  山田太郎 39才 # (A社) 山田太郎 39才 # (A社)山田太郎  39才 # (A社 B課)山田太郎 39才 # 山田太郎(A社)39才 '空白をデリミタとして、最初の文字列を取得したい。空白は半角全角両方あり、複数連続することもあり得るただし、()や[]で囲まれる文字列はスルー(空白として処理する)'(_文字列,_最初の文字列) :- split(_文字列,[' ',' ','(',')','[',']'],L1), '空白をデリミタとして、最初の文字列を取得したい。'(L1,_最初の文字列). '空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :- '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2), '空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!. '空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :- 空白は半角全角両方あり、複数連続することもあり得る(L1,L2), '空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!. '空白をデリミタとして、最初の文字列を取得したい。'([A|_],Atom). '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :- append(L0,['('|R1],[')'|R2],L1), append(L0,[' '|R2],L2),!. '()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :- append(L0,['['|R1],[']'|R2],L1), append(L0,[' '|R2],L2),!. 空白は半角全角両方あり、複数連続することもあり得る([],[]) :- !. 空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :- 空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!. 空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :- 空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!. % 以下のサイトは # ABCと続く場合を除くABという文字列をCDに置換したい場合は # どのように書いたらよいでしょうか・・・ 'ABCと続く場合を除くABという文字列をCDに置換'(_文字列,_置換された文字列) :- sub_atom(_文字列,S,2,R,'AB'), \+(sub_atom(_文字列,S+2,1,_,'C')), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+2,R,0,_後文字列), concat_atom([_前文字列,'CD',_後文字列],_置換された文字列). 'ABCと続く場合を除くABという文字列をCDに置換'(_文字列,_置換された文字列) :- sub_atom(_文字列,S,2,R,'AB'), \+(sub_atom(_文字列,S+2,1,_,'C')), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+2,R,0,_後文字列), 'ABCと続く場合を除くABという文字列をCDに置換'(_後文字列,_置換された後文字列), concat_atom([_前文字列,'CD',_置換された後文字列],_置換された文字列). 'ABCと続く場合を除くABという文字列をCDに置換'(_文字列,_文字列). %%%% 参考 検索の例 http://nojiriko.asia/prolog/seikihyogendoujou_30.html %%%% 'ABCと続く場合を除くABという文字列'(_文字列,_前文字列,'AB',_後文字列) :- sub_atom(_文字列,S,2,R,'AB'), \+(sub_atom(_文字列,S+2,1,_,'C')), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S+2,R,0,_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/86 # # php4.3.11です # --------------------------------- # $str = <<< DOC_END # あああああ # いいいいい # <html_start> # ううううう # えええええ # <html_end> # おおおおお # DOC_END; # # $pattern = "/<html_start>(.*)<html_end>/"; # $replacement = 'aaaabbbb'; # # $res = preg_replace($pattern, $replacement, $str); # print_r($res); # --------------------------------- # と出力してみましたが何も表示されませんでした。 # ホントは「あああああいいいいいaaaabbbbおおおおお」と出て欲しかったのですが…。 # 最終的には<html_start><html_end>で囲まれた範囲に # PHPのhtmlspecialchars()やnl2br()関数を適用して出力したいです。 # 'あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n を あああああいいいいいaaaabbbbおおおおお に置換する'(_置換された文字列) :- split(''あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n',['\n'],L), append(L0,[''|R1],[''|R2],L), append(L0,[aaaabbb|R2],L2), concat_atom(L2,_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/395 # # 使用言語はPHP5です # # html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたいと思い # 以下の置き換えを行い成功したのですが、 # # $html = preg_replace('{<img (.*?)>}' ,'<img $1 />' ,$html); # # 元々imgタグ内にスペースとスラッシュが最後に入っているのもありますので、それ以外ということで # # $html = preg_replace('{<img (.*?)^\/>}' ,'<img $1 />' ,$html); # # このように記述してみましたが、これですと全部のimgタグに置き換えが効かなくなりました # どういう記述をすればよいのでしょうか? # 'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[i,m,g,' '|R2],L3), append(R21,['>'],R2), \+(append(_,['>'|_],R21)), 'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(R2,L), concat_atom(L,_置換された文字列). 'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'([' ',/,>],[' ',/,>]) :- !. 'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(['>'],[' ',/,>]) :- !. 'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'([A|R1],[A|R2]) :- 'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/425 # # Jeditで # 【あいう】を【6あいう】 # 【かき】を【4かき】 # のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですが # どのように検索してどのように置換すればよいでしょうか? # 【 】ではさまれた文字数はまちまちです。 # よろしくお願いします。 # '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですがどのように検索してどのように置換すればよいか'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,L), concat_atom(L,_置換された文字列). '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,[S|R]) :- append(L0,['['|R1],[']'|R2],Chars), \+(append(_,['['|_],R1)), \+(append(_,[']'|_],R1)), length(R0,Len), Len2 is Len * 2, append(L0,['[',Len2|R0],[']'],L3), concat_atom(L3,S), '【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/503 # # 以下のような文字列を置換ですべて削除したいのですが # どうかけばいいのでしょうか # # onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()" # onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()" # onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()" # ↓ # 3行すべて削除 # # 試した正規表現 # onMouseOver="refPopUp(\d+{1,3}.,event)" onMouseOut="hidePop()" # # '以下のような文字列を置換ですべて削除したいのですが onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()" onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()" onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()" 3行すべて削除'(Lines1,Lines2) :- '文字列を置換ですべて削除したい'(Lines1,Lines2). '文字列を置換ですべて削除したい'([],[]) :- !. '文字列を置換ですべて削除したい'([_文字列|R1],R2) :- !. sub_atom(_文字列,_,_,_,'onMouseOver="refPopUp(',S2,',event)" onMouseOut="hidePop()"',L1,L2,L3), すべてが数字(L2), '文字列を置換ですべて削除したい'(R1,R2). '文字列を置換ですべて削除したい'([_文字列|R1],[_文字列|R2]) :- !. '文字列を置換ですべて削除したい'(R1,R2). すべてが数値([]) :- !. すべてが数値([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数値(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/506 # # 下記の2文にあるfontタグを消したいです。 # 正規表現を用いた1度の置換で消せますか? # # <dd><font style="font-size:;color:;"> テスト <br> テスト </font><br><br></dd> # <dd><font style="font-size:;color:;"> テスト2 <br> テスト2 </font><br><br></dd> # # # 考え方として # <dd><font style="font-size:;color:;">がある行のうち</font>を削除し、そのあと<font style="font-size:;color:;">を削除 # これで行けそうかと思ったのですが、●●がある行のうち○○を削除、という正規表現がわかりませんでした・・・ # # 'fontタグのみ削除する'(_文字列,_fontタグが削除された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,f,o,n,t|R1],[>],L2), \+(append(_,[>|_],R2)), append(L3_0,[<,/,f,o,n,t,>|R3],L3), \+(append(_,[<,/,f,o,n,t,>|_],L3_0)), append(L1,L3_0,R3,L4), atom_chars(_fontタグが削除された文字列,L4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/514 # # すみません、質問させてください。 # # 曲名のリストを一括置換しようとしています。具体的には"〜 by"が # 入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。 # # 例 # This is me (talk) (Composed by Johan) # ↓ # This is me (talk) [Composed by Johan] # # どのような書式にすればいいかご教示お願いします。 # '曲名のリストを一括置換しようとしています。具体的には"〜 by"が入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['('|R1],L3), last(R1,')'), \+(append(_,['('|_],R1)), split(R1,['(',')',' by '],[A,B]), concat_atom([S1,'[',A,' by ',B,']',S3],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/519 # # 質問させて下さい。 # # ABC # …LMNO……… # ……LMNO…… # ………LMNO… # XYZ # # というような文章があったとします。 # 「LMNO」の前後(「…」)には文字(日本語や英数字)があります。 # # Perl5互換の正規表現が使えるテキストエディタや、BREGEXP.DLLが使える置換えソフトを使用し、 # 「ABC」から「XYZ」までにある「LMNO」を「OOOO」に置換えすることは可能でしょうか? # 特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定で困っています。 # どのようにすれば良いのか教えて頂けると助かります。よろしくお願いします。 # # '特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定'(Lines,_置換されたLines) :- append(L0,['ABC'|R1],['XYZ'|R2],Lines), findall(Line2,( append(_,[Line|_],R1), 'LineのLENOをOOOOに置換する'(Line,Line2)), Lines2), append(L0,Lines2,R2,_置換されたLines). 'LineのLENOをOOOOに置換する'(Line,Line2) :- sub_atom(Line,_,_,_,S1,'LENO',S3,L1,L2,L3), concat_atom([S1,'OOOO',S3],_置換されたLine),!. 'LineのLENOをOOOOに置換する'(Line,Line). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/532 # # perlでテキストデータ内の日付部分を、 # 2009/1/1 # ↓ # 2009/01/01 # に一行で置換したいのですが。 # s|/([0-9][^0-9])|/0$1|gm; # だと、2回同じ処理が必要になってしまいます。 # いい方法ありますか? # # '2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_置換された文字列) :- '2009/1/1 -> 2009/01/01 に置換したい'(_文字列,'',_置換された文字列). '2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_前文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M,/,D],L3), concat_atom([Y1,Y2,Y3,Y4,/,'0',M,/,'0',D],S22), concat_atom([S1,S22],_置換された文字列の一), concat_atom([_前文字列,_置換された文字列の一],_前文字列の二), '2009/1/1 -> 2009/01/01 に置換したい'(_後文字列,_前文字列の二,_置換された文字列). '2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_前文字列,_置換された文字列) :- concat_atom([_前文字列,_文字列],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/547 # # PHP5で、$txtに格納された # # <a href="javascript:userid('123456');">テキスト</a> # ※「123456」と「テキスト」は変化します # # といった並びの文字列からタグをぬいて # # 123456,テキスト, # # とカンマ区切りにしたいのですが、何か良い方法はないでしょうか # # '<a href="javascript:userid(''123456'');">テキスト</a>といった並びの文字列からタグをぬいて123456,テキストとカンマ区切りにしたい'(_文字列,_置換された文字列) :- atom_chars('a href="javascript:userid(''',L0), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L0,L11,['''',')',';','"',>],L2), すべて数字(L11), atom_chars(S11,L11), append(L03,[<,/,a,>|_],L3), concat_atom(L03,S03), concat_atom([S11,S03],',',_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/554 # # PHPでPerl互換のpreg_replace関数を使った置換を行おうとしているのですが、 # やりたいことがうまく実現できません。 # # やりたいことは、 # # ・<tagA>という文字列と</tagA>のあいだに<tagInsert>という文字列を挿入したい # ・ただし、<tagA>の中に<tagB>という文字列がある場合は、その<tagB>の下に挿入したい # # # <失敗した正規表現> # $new_str = preg_replace("/<tagA(.*?)>(.*?)(<(?!tagB).)*/", '<tagA\\1>\\2<tagInsert>\\3', $str); # # <実現したい例> # <tagA> # <tagB> # <tagB> # <tagC> # </tagA> # # ↓置換実行 # <tagA> # <tagB> # <tagB> # <tagInsert> # <tagC> # </tagA> # # 'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :- append(L1,[''|R2],[''|R3],Lines1), \+(append(_,[''|_],R3)), append(_,[''|_],R3), append(L1,[''|R2],['',''|R3],Line2),!. 'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :- append(L1,[''|R2],[''|R3],Lines1), append(L1,['',''|R2],[''|R3],Line2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/568 # # perl で, # 「<と>で囲まれた文字列内の abc を def に全て置換する」 # というのは正規表現でどう書けばよいでしょうか。 # # マッチだけならば # "<asaabcasalaabca>" =~ /\<(.*?)(abc(.*?))*?\>/ # のようにしてマッチさせられるのですが,繰り返しがあるので後方参照で取得できません。 # # '<と>で囲まれた文字列内の abc を def に全て置換する'('','') :- !. '<と>で囲まれた文字列内の abc を def に全て置換する'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<'|R2],L3), append(L00,['>'],R2), abcをdefに置換する(L00,L22), append(L1,['<',L22],['>'],L4), concat_atom(L4,S22), '<と>で囲まれた文字列内の abc を def に全て置換する'(S3,S4), concat_atom([S22,S4],_置換された文字列). abcをdefに置換(L1,L2) :- append(L0,[a,b,c|R1],L1), append(L0,[d,e,f|R1],L2),!. abcをdefに置換(L,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/755 # # すいません。行頭のスペースが消えておかしくなりましたので書き込み直します。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索(Stringクラス String[] split(String regex)メソッドによる文字列分割) # # ●説明 # CSVファイル中の一行を対象文字列とし、 # その文字列中初出の\s*,\s*をデータ区切り子として見なしマッチさせる。 # (その前後で文字列を2つに分割) # # ●対象データ # aaa,bbb,ccc # aaa, bbb, ccc # aaa , bbb , ccc # # ●希望する結果 # "aaa"と"bbb,ccc"に分割 # "aaa"と"bbb, ccc"に分割 # "aaa"と"bbb , ccc"に分割 # # ●希望しない結果 # "aaa"と"bbb"と"ccc"に分割 # etc... # # 自分で考えた(?<^[^,]*)\s*,\s*では # java.util.regex.PatternSyntaxException: Unknown look-behind group near index 8 # というような例外が出てしまいました。 # # よろしくお願いします。 # # 'CSVファイル中の一行を対象文字列とし、その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(_csvファイル,_行,_前文字列,_後文字列) :- get_lines(_ファイル,Lines), append(L0,[Line|R],Lines), _行 is L0 + 1, 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列), fail. 'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列) :- sub_atom(Line,_,_,_,_前文字列,_区切り文字列,_後文字列,L1,L2,L3), append(L0,[','|R],L2), all(L0,' '), \+((append(L01,[A|_],R),\+(A=' '))),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/630 # # 質問させてください! # # ああああああ @ ABCD @ abcd # # という文字を # # <b>ああああああ</b> @ ABCD @ <em>abcd</em> # # のように置換したい時はどういう正規表現を使えばいいのでしょうか? # # よろしくお願いいたします # # 'ああああああ @ ABCD @ abcd という文字を <b>ああああああ</b> @ ABCD @ <em>abcd</em> のように置換したい'(_文字列,_置換された文字列) :- sPLIT(_文字列,' @ ',[A,B,C]), concat_atom(['',A,'',' @ ',B,' @ ','',C,''],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/760 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # =の連続がある行で挟まれた部分を抽出したい # # ●対象データ # ゲスト======================== # ほげほげ # ほげほげほげ # プロフィール=================== # はげ # はげはげ # ============================= # # ●希望する結果 # "ほげほげ\nほげほげほげ" # "はげ\nはげはげ" # # 結果に=の行が含まれていても構いません # =は2つ以上連続している行が対象です # # ^.*={2,}$(?'block'.+?)^.*={2,}$ とやってみましたがマッチしませんでした # MultiLineオプションは指定しています # それと対象文字列から\rは事前に除去しています # # よろしくお願いします # # '=の連続がある行を区切りとして検索する'([],[]) :- !. '=の連続がある行を区切りとして検索する'([Line|R1],[S|R2]) :- sub_atom(Line,_,2,_,'=='), '=の連続がある行が来るまで検索する'(R1,L1,R11), concat_atom(L1,'\n',S), '=の連続がある行を区切りとして検索する'(R11,R2). '=の連続がある行を区切りとして検索する'([_|R1],R2) :- '=の連続がある行を区切りとして検索する'(R1,R2). '=の連続がある行が来るまで検索する'([Line|R1],[],[Line|R1]) :- sub_atom(Line,_,2,_,'=='),!. '=の連続がある行が来るまで検索する'([Line|R1],[Line|R2],R3) :- '=の連続がある行が来るまで検索する'(R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/640 # # 現在、HTMLのimgタグを使って「/img/jpg/」ディレクトリにある画像ファイルを複数表示しています。 # # 例) # <img src="/img/jpg/1111.jpg" > # <img src="/img/jpg/mm2222.jpg" > # <img src="/img/jpg/kkkkk3333.jpg" > # # これをそれぞれ、以下のように置換したいと考えています。 # 例) # <a href="http://ime.nu/www.xxxxx.jp/1111.jpg"><img src="/img/jpg/1111.jpg" width="240px"></a> # <a href="http://ime.nu/www.xxxxx.jp/mm2222.jpg"><img src="/img/jpg/mm2222.jpg" width="240px"></a> # <a href="http://ime.nu/www.xxxxx.jp/kkkkk3333.jpg"><img src="/img/jpg/kkkkk3333.jpg" width="240px"></a> # # imgタグをリンクタグで囲むのですが、リンク先URLには元々の画像ファイル名が使われています。また、imgタグには「width="240px"」が付加されています。 # # このような置換をPHP5で行うには、どのような正規表現を使用したらよろしいでしょうか。 # 宜しくお願い致します。 # # 'imgタグをaタグ+imgタグに書き換える'(Lines,_置換されたLines) :- findall(_置換された文字列,( append(_,[_文字列|_],Lines), 文字列の置換(_文字列,_置換された文字列)), _置換されたLines). 文字列の置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,i,m,g,' ',s,r,c,=,'"',/,i,m,g,/,j,p,g,/|R2], L3 = [>|R3], \+(append(_,[>|_],R2)), concat_atom(R2,S22), concat_atom([S1,' '|R3],_置換された文字列),!. 文字列の置換(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/642 # # Perl 5.8 /5.10で使用します。 # # HTMLソースの中のimgタグのファイル名を正規表現などで一括で変えたいです。 # # <img src="http://ime.nu/www.hoge.com/aaa/bb/ccc/ddd.jpg" alt="sss"> # <img src="/xxx/yyy.png"> # <img src="../aaa/fff/xxx/ccc.gif" width="32" height="16"> # #            ↓ # # <img src="/images/ddd.jpg" alt="sss"> # <img src="/images/yyy.png"> # <img src="/images/ccc.gif" width="32" height="16"> # # こんな感じです。どの様にしたらよいでしょうか。 # 'imgタグの書き換え'(Lines,_置換されたLines) :- findall(_置換された文字列,( append(_,[_文字列|_],Lines), 文字列の置換(_文字列,_置換された文字列)), _置換されたLines). 文字列の置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,i,m,g,' ',s,r,c,=,'"'|R2], L3 = [>|R3], \+(append(_,[>|_],R2)), concat_atom(R2,S22), split(S22,['/'],L), last(L,F), concat_atom([S1,'% 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/669 # # php5で、tableタグ内の改行(<br />)を全て削除したいのです。 # どうしたら良いんでしょう。 # # ●置換前 # <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br /> # <tbody><br /> # <tr><br /> # <td><br /> # </td><br /> # </tr><br /> # </tbody><br /> # </table> # # ●置換後 # <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"> # <tbody> # <tr> # <td> # </td> # </tr> # </tbody> # </table> # # 'br/タグを削除する'(Lines,Lines2) :- findall(Line2,( append(L0,[Line|R],Lines), '行末のbr / タグを削除する'(Line,Line2)), Lines2). '行末のbr / タグを削除する'(Line,Line2) :- sub_atom(Line,S,6,0,'
'), sub_atom(LIne,0,S,_,Line2),!. '行末のbr / タグを削除する'(Line,Line). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/27 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/zKDn7mD5 # # # 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁S壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 # 壁 壁   壁   壁 壁     壁 壁   壁 壁   壁 # 壁 壁 壁壁壁 壁 壁 壁 壁壁壁 壁 壁 壁 壁 壁壁壁 壁 # 壁 壁   壁 壁 壁 壁 壁   壁   壁 壁 壁   壁 # 壁 壁壁壁 壁 壁 壁 壁 壁 壁壁壁 壁壁壁壁壁 壁壁壁 壁 # 壁     壁 壁     壁   壁 壁   壁 壁   壁 # 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁壁壁 壁壁壁 壁 # 壁     壁   壁   壁 壁 壁     壁 壁   壁 # 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁 壁 壁壁壁壁壁 壁壁壁 壁 # 壁     壁     壁 壁   壁   壁 壁 壁   壁 # 壁壁壁 壁 壁壁壁 壁 壁 壁 壁 壁 壁壁壁 壁 壁壁壁 壁 # 壁   壁 壁   壁 壁 壁 壁 壁     壁 壁   壁 # 壁 壁 壁 壁 壁壁壁 壁 壁 壁 壁壁壁壁壁 壁 壁壁壁 壁 # 壁 壁 壁 壁   壁 壁 壁 壁       壁 壁 壁 壁 # 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁 壁壁壁壁壁 壁 壁 壁 壁 # 壁     壁   壁 壁   壁 壁     壁 壁 壁 壁 # 壁 壁壁壁 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁 # 壁 壁   壁     壁 壁   壁     壁 壁 壁 壁 # 壁 壁壁壁壁壁 壁 壁 壁 壁壁壁 壁壁壁 壁壁壁 壁 壁 壁 # 壁     壁 壁 壁   壁   壁     壁     壁 # 壁壁壁壁壁 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁壁壁 壁壁壁壁壁 # 壁             壁 壁 壁 壁   壁     壁 # 壁 壁壁壁 壁壁壁壁壁壁壁 壁 壁 壁 壁壁壁壁壁壁壁壁壁 壁 # 壁 壁   壁         壁       壁   壁 壁 # 壁 壁 壁 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 # 壁 壁 壁 壁 壁           壁   壁     壁 # 壁 壁 壁 壁 壁 壁壁壁壁壁壁壁 壁 壁 壁 壁壁壁壁壁 壁 # 壁 壁 壁 壁         壁 壁 壁 壁 壁     壁 # 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁 壁 壁 壁壁壁壁壁 # 壁       壁 壁   壁 壁 壁   壁 壁 壁   壁 # 壁壁壁壁壁壁壁 壁 壁 壁壁壁 壁 壁壁壁 壁 壁 壁壁壁 壁 # 壁               壁 壁   壁 壁 壁 壁 壁 # 壁 壁 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁 壁 壁 壁 壁 # 壁 壁 壁 壁       壁 壁     壁 壁 壁 壁 壁 # 壁壁壁 壁 壁 壁壁壁 壁 壁 壁 壁壁壁壁壁 壁 壁 壁 壁 # 壁         壁 壁   壁             壁 # 壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁壁G壁 迷路探索(_迷路ファイル,_経路) :- 迷路情報の取得(_迷路ファイル,_迷路情報), Sの位置は(_迷路情報,_行S,_列S), Gの位置は(_迷路情報,_行G,_列G), 迷路探索(_迷路情報,_置換された迷路情報,_行S,_列S,_行G,_列G,[],Log), reverse(Log,Log2), 経路の整理(Log2,_経路). 迷路情報の取得(_迷路ファイル,_迷路情報) :- get_chars(_迷路ファイル,Chars), 改行文字で分割(Chars,_迷路情報),!. Sの位置は(LL1,_行,_列) :- append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[S|_],L), length([_|L1],_列),!. Gの位置は(LL1,_行,_列) :- append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[G|_],L), length([_|L1],_列),!. 改行文字で分割([],[]) :- !. 改行文字で分割(L1,[L0|R2]) :- append(L0,['\n'|R],L1),!, 改行文字で分割(R,R2). 迷路探索(LL1,_行G,_列G,_行G,_列G,Log,Log) :- !. 迷路探索(LL1,_行,_列,Log1,Log) :- append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[A|_],L), length([_|L1],_列), 次の選択(LL1,_行,_列,Log1,_行2,_列2), 迷路探索(LL1,_行2,_列2,_行G,_列G,[[_行,_列,_行2,_列2]|Log1],Log). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _行2 is _行 + 1, \+(append(_,[[_行2,_列,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行2,_列]|_],Log1), append(L0,[L|_],LL1), length([_,_|L0],_行), append(L1,[A|_],L), length([_|L1],_列), \+(A = 壁). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _行2 is _行 - 1, \+(append(_,[[_行2,_列,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行2,_列]|_],Log1), append(L0,[L|_],LL1), length(L0,_行), append(L1,[A|_],L), length([_|L1],_列), \+(A = 壁). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _列2 is _列 + 1, \+(append(_,[[_行,_列2,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行,_列2]|_],Log1), append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[A|_],L), length([_,_|L1],_列), \+(A = 壁). 次の選択(LL1,_行,_列,Log1,_行2,_列) :- _列2 is _列 - 1, \+(append(_,[[_行,_列2,_行,_列]|_],Log1), \+(append(_,[[_行,_列,_行,_列2]|_],Log1), append(L0,[L|_],LL1), length([_|L0],_行), append(L1,[A|_],L), length(L1,_列), \+(A = 壁). 経路の整理([[_行1,_列1,_行2,_列2]],[[行1,_列1],[_行2,_列2]]) :- !. 経路の整理([[_行1,_列1,_行2,_列2]|R1],[[行1,_列1]|R2]) :- !. 経路の整理([R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/277 # # [1] 授業単元:プログラミング C言語 # [2] 問題文(含コード&リンク): 次の投稿に # # ../test/read.cgi/tech/1296387672/277   住所録を以下の条件で作成 #  ―蚕袁燭涼羶箸六疚勝⇒絞愴峭罅⊇蚕蝓電話番号のみ。以下の構造体を使用。 # typedef struct jusyoroku { #     char name[32];     #     char yubin[32];  #     char add[32];  # char tel[32];       # } # ◆―蚕袁燭魯謄ストファイルに保存。氏名、郵便番号、住所、電話番号が1行ずつ記載され、 # 1件ごとに「-----」区切られ、最後は「*****」となる。 # 例: # 氏名 # 郵便番号 # 住所 # 電話番号 # ----- # : # : # : # ----- # 氏名 # 郵便番号 # 住所 # 電話番号 # ***** # E佻新鐃瑤100件まで # い海離愁侫箸六慊蠅靴織侫.ぅ襪ら住所録を読み込め、また、保存もできる。 # イ海離愁侫箸禄蚕袁燭ら氏名、または電話番号で一致する人物を検索、情報をすべて表示できる。 # 新しい住所録の追加、既存の住所録の変更・削除が可能。 # それぞれの機能はわかりやすく関数に分割すること。 # # よろしくお願いします。 # # 住所録を読み取る(_テキストファイル,_住所録) :- open(_テキストファイル,read,Instream), get_line(Instream,Line), 住所録を読み取る(Instream,Line,_住所録), 住所録を登録(_住所録), close(Instream),!. 住所録を読み取る(Instream,Line,[]) :- sub_atom(Line,0,1,'*'),!. 住所録を読み取る(Instream,Line,_住所録) :- sub_atom(Line,0,1,'-'), get_line(Instream,Line2), 住所録を読み取る(Instream,Line,_住所録). 住所録を読み取る(Instream,Line,[[_氏名,_郵便番号,_住所,_電話番号]|R]) :- \+(sub_atom(Line,0,1,'-')), \+(sub_atom(Line,0,1,'*')), Line = _氏名, 郵便番号を読み取る(Instream,_郵便番号), 住所を読み取る(Instream,_住所), 電話番号を読み取る(Instream,_電話番号), get_line(Line2), 住所録を読み取る(Instream,Line2,R). 氏名を読み取る(Instream,_氏名) :- get_line(Instream,_氏名),!. 郵便番号を読み取る(Instream,_郵便番号) :- get_line(Instream,_郵便番号),!. 住所を読み取る(Instream,_住所) :- get_line(Instream,_住所),!. 電話番号を読み取る(Instream,_電話番号) :- get_line(Instream,_電話番号),!. 住所録を登録(_住所録) :- abolish(住所録/4), append(_,[[_氏名,_郵便番号,_住所,_電話番号]|R],_住所録), assertz(住所録(_氏名,_郵便番号,_住所,_電話番号)), R = []. テキスト名を指定して住所録の保存(_保存テキスト名) :- open(_保存テキスト名,write,Outstream), 住所録の保存(Outstream), close(Outstream). 住所録の保存(Outstream) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted(Outstream,'-----\n%32s\n%32s\n%32s\n%32s\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 住所録の保存(Outstream) :- write(Outstream,'*****\n'),!. 住所録から氏名、または電話番号で一致する人物を検索して情報を表示する :- write('検索語を入力してください : '), get_line(_検索語), 氏名を鍵に住所録を検索する(_検索語), 電話番号を鍵に住所録を検索する(_検索語). 氏名を鍵に住所録を検索する(_氏名) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 氏名を鍵に住所録を検索する(_). 電話番号を鍵に住所録を検索する(_住所) :- 住所録(_氏名,_郵便番号,_住所,_電話番号), write_formatted('%t,%t,%t,%t\n',[_氏名,_郵便番号,_住所,_電話番号]), fail. 電話番号を鍵に住所録を検索する(_). 新しい住所録の追加 :- write('氏名を入力してください : '), get_line(_氏名), write('郵便番号を入力してください : '), get_line(_郵便番号), write('住所を入力してください : '), get_line(_住所), write('電話番号を入力してください : '), get_line(_電話番号), assertz((住所録(_氏名,_郵便番号,_住所,_電話番号)), 住所録述語の保存. 既存の住所録を定義順の変更なしに変更 :- write('氏名を入力してください : '), get_line(_氏名), write('変更項目を選択してください : '), get_line(_変更項目), 既存の住所録の変更(_氏名,_変更項目,_変更された住所録), 住所録を登録(_変更された住所録), 住所録述語の保存. 既存の住所録を定義順の変更なしに変更(_氏名,郵便番号,_住所録) :- write('郵便番号を入力してください : '), get_line(_郵便番号), findall([_氏名,_郵便番号,_住所,_電話番号],( clause(住所録(_氏名,_郵便番号,_住所,_電話番号),_)), L1), 郵便番号を置換(_氏名,L1,_住所録). 既存の住所録を定義順の変更なしに変更(_氏名,住所,_住所録) :- write('住所を入力してください : '), get_line(_住所), findall([_氏名,_住所,_住所,_電話番号],( clause(住所録(_氏名,_住所,_住所,_電話番号),_)), L1), 住所を置換(_氏名,L1,_住所録). 既存の住所録を定義順の変更なしに変更(_氏名,電話番号,_住所録) :- write('電話番号を入力してください : '), get_line(_電話番号), findall([_氏名,_電話番号,_住所,_電話番号],( clause(住所録(_氏名,_電話番号,_住所,_電話番号),_)), L1), 電話番号を置換(_氏名,L1,_住所録). 郵便番号を置換(_氏名,_郵便番号,[],[]) :- !. 郵便番号を置換(_氏名,_郵便番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_郵便番号,_住所,_電話番号]|R2]) :- 郵便番号を置換(_氏名,_郵便番号,R1,R2). 郵便番号を置換(_氏名,_郵便番号,[L|R1],[L|R2]) :- 郵便番号を置換(_氏名,_郵便番号,R1,R2). 住所を置換(_氏名,_住所,[],[]) :- !. 住所を置換(_氏名,_住所,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_住所,_住所,_電話番号]|R2]) :- 住所を置換(_氏名,_住所,R1,R2). 住所を置換(_氏名,_住所,[L|R1],[L|R2]) :- 住所を置換(_氏名,_住所,R1,R2). 電話番号を置換(_氏名,_電話番号,[],[]) :- !. 電話番号を置換(_氏名,_電話番号,[[_氏名,_,_住所,_電話番号]|R1],[[_氏名,_電話番号,_住所,_電話番号]|R2]) :- 電話番号を置換(_氏名,_電話番号,R1,R2). 電話番号を置換(_氏名,_電話番号,[L|R1],[L|R2]) :- 電話番号を置換(_氏名,_電話番号,R1,R2). 住所録述語の保存 :- tell('住所録#4.pro'), listing(住所録), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/819 # # 正規表現の使用環境は秀丸です。 # やりたいことは置換で、VBのソースを編集したいのが目的です。 # # 例: # ・Before # Dim s1, s2, s3 As String # # ・After # Dim s1 As String, s2 As String, s3 As String # # 上記のように、1行で複数の変数宣言を行っている箇所で # 型の宣言を省略している箇所を、最後の型宣言で補いたいのですが # どのように指定してやればよいでしょうか? # # '型の宣言を省略している箇所を、最後の型宣言で補う'(_文字列,_補正された文字列) :- 's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分), findall(W,( append(_,[_変数|_],_変数部分ならび), concat_atom([_変数,_型部分],W)), L2), concat_atom(L2,',',S5), concat_atom(_型宣言部分,S5,_補正された文字列). 's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分) :- split(_文字列,[','],[_第一要素|R1]), sPLIT(_第一要素,[' '],L1), append(L0,[A],L1), concat_atom(L0,_型宣言部分), append(L2,[U],R1), sPLIT(U,[' '],L3), '最後の変数と型部分に分離する'(L3,Z,_型部分), append([A],L2,[Z],_変数部分ならび),!. '最後の変数と型部分に分離する'(L,S,_型部分) :- append(L0,[_最後の変数|R],L), \+(A = ' '), all(L0,' '), concat_atom(R,_型部分),!. '最後の変数と型部分に分離する'([_最後の変数|R],_最後の変数,_型部分) :- concat_atom(R,_型部分),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/831 # # 質問です # C++をC#にするにはどうすればよいですか # # 'C++をC#にするには'(_文字列,_置換された文字列) :- 全置換(_文字列,'c++','c#',_置換された文字列). 全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- findall(S,( ひとつひとつ置換(_文字列,'c++','c#',S)), L), last(L,_置換された文字列),!. 全置換(_文字列,_,_,_文字列). ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), \+(sub_atom(S1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列,S3],_置換された文字列). ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), \+(sub_atom(S1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列],_置換された文字列1), ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2), concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/831 # % % 文字列に対して、置換対象部分すべてを置換します。 % 置換対象となる文字列が見つからなかった時でも、僞にはなりません。 % % ひとつひとつ置換は置換対象文字列を最初からひとつひとつ順に置換して行きます。 % 全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- findall(S,( ひとつひとつ置換(_文字列,'c++','c#',S)), L), last(L,_置換された文字列),!. 全置換(_文字列,_,_,_文字列). ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), \+(sub_atom(S1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列,S3],_置換された文字列). ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), \+(sub_atom(S1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列],_置換された文字列1), ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2), concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/831 # % % ひとつひとつ置換は置換対象文字列をひとつひとつ順に置換していく、 % 非決定性の述語です。 % 一度置換された部分は次の置換候補が置換された時にも置換されたままであり、 % 元に戻ることはありません。 % 置換される対象がなくなって、さらのバックトラックにより、起動されると僞となります。 % % ひとつひとつ置換/6 は置換される度に、前文字列、後文字列を切り出す。 % 置換文字列の引数位置に注意が必要。 % ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), \+(sub_atom(S1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列,S3],_置換された文字列). ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), \+(sub_atom(S1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列],_置換された文字列1), ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2), concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列). ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,_前文字列), \+(sub_atom(_前文字列,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,_後文字列), concat_atom([S1,_置換文字列,S3],_置換された文字列). ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,_前文字列1), \+(sub_atom(_前文字列1,_,Len2,_,_置換対象文字列)), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,_残り文字列), ひとつひとつ置換(_残り文字列,_置換対象文字列,_前文字列2,_置換文字列,_後文字列,_置換された文字列2), concat_atom([_前文字列1,_置換文字列,_前文字列2],_前文字列), concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列). % 以下のサイトは % % 文字列の置換述語。最初に見つかった置換可能部分を置換する決定性述語。 % % どこが置換された部分であるか、分かりにくいのが欠点です。 % % 最初のひとつだけ置換/6 は置換された部分の前文字列と後文字列を明示した。 最初のひとつだけ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列,S3],_置換された文字列),!. 最初のひとつだけ置換(_文字列,_置換対象文字列,_前文字列,_置換文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,_前文字列), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,_後文字列), concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列),!. % 以下のサイトは % % 常に置換可能な部分のうち一箇所だけが置換される述語定義です。 % % 対象文字列がccで文字列中にcが3個以上連なっている場合などは % 最初のccの切り出しの後、そのccを除外して置換対象を探すか、 % あるいは最初のcの次のc以後を置換対象とするかの選択が有り得ます。 % % 以下は前者、一旦置換対象になった文字列を外して、そのあとからの % 文字列から次の置換対象文字列を探す場合の述語定義です。 % % この定義はどこが置換された場所であるか、分かりにくいのが欠点です。 % '常に置換可能な部分のうち一箇所だけが置換される。'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- '常に置換可能な部分のうち一箇所だけが置換される。 置換対象文字列があれば全て書き換える'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列),!. '常に置換可能な部分のうち一箇所だけが置換される'(_文字列,_,_,_文字列). '常に置換可能な部分のうち一箇所だけが置換される。 置換対象文字列があれば全て書き換える'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換対象文字列を得る(_文字列,_置換対象文字列,_前文字列,_後文字列), '常に置換可能な部分のうち一箇所だけが置換される'(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). 置換対象文字列を得る(_文字列,_置換対象文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_置換対象文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/831 # % % % 常に置換可能な部分のうち一箇所だけが置換される述語定義です。 % % % 対象文字列がccで文字列中にcが3個以上連なっている場合などは % 最初のccの切り出しの後、そのccを除外して置換対象を探すか、 % あるいは最初のcの次のc以後を置換対象とするかの選択が有り得ます。 % % 以下は後者、一旦対象になった文字列に重なって次の対象文字列を % 探す場合の述語定義です。 % % この定義はどこが置換されたか分かりにくいのが欠点です。 % 'ひとつだけ置換(対象文字列の重なりを許す)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列), sub_atom(_文字列,0,Len1,_,S1), St is Len1+Len2, sub_atom(_文字列,St,Len3,_,S3), concat_atom([S1,_置換文字列,S3],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/865 # # 質問させてください。 # 「<img」以外の「<」を「&lt;」に置き換えるにはどう書けば良いでしょうか? # #「img(中略)>」以外の「>」も「&gt;」に置き換える必要ありがますが、そちらはまた別途考えるとして。。 # 言語はPHPです。よろしくお願いします。 # '「|R3]), '「|R3],_置換した部分までの文字列,_残り文字列), concat_atom([_置換した部分までの文字列,_残り文字列],_置き換えた文字列). '「|R3]), '「|R3],_置換した部分までの文字列,_残り文字列) :- \+(append(_,[<|_],R2)), \+(append(_,[>|_],R2)), append(L1,['<'|R2],['>'],L4), concat_atom(L4,_置換した部分までの文字列), concat_atom(R3,_残り文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/905 # # ●実装しようとしている正規表現 # ^[1-9]\d{3}$ # # PHPのpreg_matchでいえば # preg_match (/^[1-9]\d{3}$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 4桁の西で0000のみを除外したい。 # 西暦1万年(10000)以上は考慮しない # # 0000 × # 1000〜9999 ○ # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # # # '4桁の西暦で0000のみを除外したい'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_検索文字列,後文字列,L1,[A,B,C,D],L3), digit(A), digit(B), digit(C), digit(D), \+((A='0',B='0',C='0',D='0')), \+((last(L1,Z),digit(Z))), \+((L3=[H|_],digit(H))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/906 # # ●実装しようとしている正規表現 # ^[0][1-9]$|^[1-9]\d$ # # PHPのpreg_matchでいえば # preg_match (/^[0][1-9]$|^[1-9]\d$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 2桁の月で00のみを除外したい。 # # 00   × # 01〜12 OK(13〜99は他の方法で除外しています) # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # # # '2桁の月で00のみを除外したい'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_検索文字列,後文字列,L1,[A,B],L3), digit(A), digit(B), \+((A='0',B='0')), \+((last(L1,Z),digit(Z))), \+((L3=[H|_],digit(H))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/908 # # ●実装しようとしている正規表現 # ^(\d{1,6})(\.\d+)?$ # # PHPのpreg_matchでいえば # preg_match (/^(\d{1,6})(\.\d+)?$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 整数部が6桁までの数値を許可。 # 小数点を含む入力を許可。 # 小数点以下は特に制限しない(DB側の丸め処理に依存) # # 1234567  × # 123456.  × # 123456.1 _OK # 1.1    OK # 0.12・・89 _OK # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # '整数部が6桁までの数値を許可。小数点を含む入力を許可。小数点以下は特に制限しない(DB側の丸め処理に依存)'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_検索文字列,後文字列,L1,L2,L3), 許可される文字だけで構成(L2), 最初と最後は数字でなくてはならない(L2), 検索文字列の前後は数字ではない(L1,L3), 整数部が6桁まで(L2). 許可される文字だけで構成(L2) :- append(_,[A|_],L2), \+(検索文字列で許可される文字(A)),!,fail. 許可される文字だけで構成(_). 検索文字列で許可される文字(A) :- digit(A),!. 検索文字列で許可される文字('.'). 最初と最後は数字でなくてはならない(L2) :- L2 = [H|_], digit(H), last(L2,LZ), digit(LZ). 検索文字列の前後は数字ではない(L1,L3) :- \+((last(L1,Z),digit(Z))), \+((L3=[H|_],digit(H))). 整数部が6桁まで(L) :- append(L0,['.'|R],L), ピリオドは一個まで(L0,R), '6桁以下'(L0). 整数部が6桁まで(L) :- '6桁以下'(L). ピリオドは一個まで(L0,R) :- \+(append(_,['.'|_],L0)), \+(append(_,['.'|_],R)). '6桁以下'(L0) :- length(L0,Len), Len =< 6,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/921 # # <p>text</p> を <h3>text</h3> に変換したいんです。 # # ただし text がない<p></p>はそのままで。 # # '/<p>(.+?)<\/p>/is', '<h3>$1</h3>' # # ここから進まない… 助けて # % % 最初から順に変換していく非決定性の述語とすべてを一気に変換してしまう決定性の述語の両例を示す。 %%%%%% 最初から順に変換していく。以前に変換された部分が変換前の状態に戻ることがないように注意する %%%%% '

text

text

に変換したい'(_文字列,_変換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'|L3],L4), atom_chars(_変換された文字列,L4). '

text

text

に変換したい'(_文字列,_変換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'],L4), atom_chars(_変換された文字列1,L4). '

text

text

に変換したい'(S3,_変換された文字列2), concat_atom([_変換された文字列1,_変換された文字列2],_変換された文字列),!. '

text

text

に変換したい'(_文字列,_文字列). %%%%%%%%%%%%%%%%%%%% 全体を一気に変換してしまう決定性の述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '

text

text

に変換したい(全置換)'(_文字列,_変換された文字列) :- '文字列の中の

text

text

に変換し、変換部分までのならびとする'(_文字列,L), concat_atom(L,_変換された文字列). '

text

text

に変換し、変換部分までのならびとする'(_文字列,[_変換された文字列|R]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'],L4), atom_chars(_変換された文字列,L4), '

text

text

に変換部分までのならびとする'(S3,R),!. '

text

text

に変換し、変換部分までのならびとする'(_文字列,[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/932 # # お知恵をお貸しください…!どうかお詳しい方よろしくお願いいたしますm(__)m # # ●正規表現の使用環境 # VBScript # # ●検索か置換か? # 検索 # # ●説明 # メールアドレスをチェックしたい # 1.メールは1つか、複数 # 2.複数メールはカンマで区切られる # 3.カンマの直後にスペースが入るかも # 4.メールの@以降は固定(間違って変な宛先に送らないため) # 5.@より前はてきとう # # つづく # # # メールアドレス検索(_文字列,_メールアドレス) :- split(_文字列,[',',' ','\n'],L), append(_,[_メールアドレス|R],L), sub_atom(_メールアドレス,_,_,_,S1,S2,S3,L1,['@'|R2],L3), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/968 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 置換 # # ●説明 # 重複する文字列と区切り文字を削除したい # # ●対象データ # aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい # # ●希望する結果 # aaa;bbb;ccc;あああ;いいい # # よろしくお願いします # # 区切り文字を除く重複する文字列と区切り文字を削除したい(_文字列,_区切り文字,_重複する文字列と区切り文字を削除した文字列) :- split(_文字列,[_区切り文字],_区切られた要素ならび), 出現順序を崩さず重複を取り除く(_区切られた要素ならび,[],_重複を取り除いた区切られた要素ならび), concat_atom(_重複を取り除いた区切られた要素ならび,_区切り文字,_重複する文字列と区切り文字を削除した文字列). 出現順序を崩さず重複を取り除く([],L,L) :- !. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(_,[A|_],L1), 出現順序を崩さず重複を取り除く(R1,L1,L),!. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(L1,[A],L2), 出現順序を崩さず重複を取り除く(R1,L2,L),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/968 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 置換 # # ●説明 # 重複する文字列と区切り文字を削除したい # # ●対象データ # aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい # # ●希望する結果 # aaabbbcccあああいいい # # よろしくお願いします # # 重複する文字列と区切り文字を削除したい(_文字列,_重複する文字列と区切り文字を削除した文字列) :- split(_文字列,[' ',',','/',':',';'],_区切られた要素ならび), 出現順序を崩さず重複を取り除く(_区切られた要素ならび,[],_重複を取り除いた区切られた要素ならび), concat_atom(_重複を取り除いた区切られた要素ならび,_重複する文字列と区切り文字を削除した文字列). 出現順序を崩さず重複を取り除く([],L,L) :- !. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(_,[A|_],L1), 出現順序を崩さず重複を取り除く(R1,L1,L),!. 出現順序を崩さず重複を取り除く([A|R1],L1,L) :- append(L1,[A],L2), 出現順序を崩さず重複を取り除く(R1,L2,L),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/974 # # ●正規表現の使用環境 # linux コマンドラインの grep # # ●検索か置換か? # 検索 # # ●説明 # 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい # # ●対象データ # aaabbbcccあああいいい # aaabbbcccううういいい # aaabbbcccえええいいい # # ●希望する結果 # aaabbbcccううういいい # aaabbbcccえええいいい # # 「説明」がうまく書けないのですが。 # よろしくお願いします # # 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい(_文字列ならび,_対象文字列,_特定のパターン,_末尾部分,_特定パターンを除去した文字列ならび) :- findall(_文字列,( sub_atom(_文字列,S,_,0,_末尾部分), sub_atom(_文字列,0,S,_,_対象文字列), \+(call(_特定パターン))), _特定パターンを除去した文字列ならび). % % _特定パターン述語の引数に必ず_対象文字列を持つこと % 例えば、 削除パターン(_対象文字列) :- sub_atom(_対象文字列,_,_,_,あああ). ?- _対象データ = [aaabbbcccあああいいい,aaabbbcccううういいい,aaabbbcccえええいいい], 末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい(_対象データ,_対象文字列,削除パターン(_対象文字列),いいい,_特定パターンを除去した文字列ならび). _特定パターンを除去した文字列ならび = [aaabbbcccううういいい,aaabbbcccえええいいい]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/9 # # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 置換 # # ●説明 # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。 # # ●対象データ # AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」 # # ●希望する結果 # BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」 # # 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_置換された文字列) :- 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列), 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_後文字列,_置換された文字列の二), concat_atom([_前文字列,_置換された文字列の二],_置換された文字列),!. 鍵カッコ内の文字列と前方の文字列を入れ替えたい。(_文字列,_文字列) :- !. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,[/|R1],[「|R2],[」|R3]), \+(append(_,[」|_],R1), append([/|R2],[「|R1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. 置換部分の確定(_文字列,S1,S2,S3,R1,R2,R3,_前文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[「|R2],[」|R3]), \+(append(_,[」|_],R1), append(R2,[「|L1],[」],L0), atom_chars(_前文字列,L0), atom_chars(_後文字列,R3),!. % 以下のサイトは # http://hibari.2ch.net/test/read.cgi/tech/1301067486/12 # ●正規表現の使用環境 # 秀丸(複数行置換) # ●検索か置換か? # 置換 # ●説明 # 上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ # 変更したいです。 # # ●対象データ # name=Relative # color=#000000 # style=0 # # ●希望する結果 # name=Relative # color=#000000 # style=2 # # ******************************************** # 下のようにnameとcolorは値が変わるので.*としているのですが、 # 置換文の置換時に変更しないという書き方が分かりません。 # 分かる方おりましたら教えて下さいませ。 # # [検索条件] # name=.* # color=.* # style=0 # # [置換文] # name= # color= # style=2 # # '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(_文字列,_変更文字列) :- \+(list(_文字列)), split(_文字列,['\n'],Liens), '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(Lines1,Lines2), concat_atom(Lines2,'\n',_変更文字列). '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(Lines1,Lines2) :- list(Lines1), append(L0,[Line1,Line2,'style=0'|R],Lines), sub_atom(Line1,0,5,_,'name='), sub_atom(Line2,0,6,_,'color='), append(L0,[Line1,Line2,'style=2'|R],Lines2), '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(R,Lines3), append(Lines2,Lines3,Lines),!. '上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/15 # # Excelの置換で、 # マッチした文字列を、マッチした文字列の最初の一文字で置換したいです。 # # たとえば、 # # りんご # ごりら # ぼーる # # だと、 # # り # ご # ぼ # # に置換したいです。 # 置換前の正規表現と、置換後の正規表現はどのようにすればよいのでしょうか? # # マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,_マッチした文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,_マッチした文字列_1,S3,L1,L2,L3), 検索条件(_マッチした文字列_1), sub_atom(_マッチした文字列_1,0,1,_,_最初の一文字), concat_atom([S1,_最初の一文字,S3],_置換された文字列_1), マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,S1,_最初の一文字,S3,_マッチした文字列_1,_マッチした文字列,_置換された文字列_1,_置換された文字列). マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,_,_,_,_マッチした文字列,_マッチした文字列,_置換された文字列,_置換された文字列). マッチした文字列を、マッチした文字列の最初の一文字で置換する(_文字列,S1,_最初の一文字,S3,_,_マッチした文字列,_,_置換された文字列) :- マッチした文字列を、マッチした文字列の最初の一文字で置換する(S3,_マッチした文字列,_置換された文字列_2), concat_atom([S1,_最初の一文字,_置換された文字列_2],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/19 # # 繰り返しの処理は分かるので正規表現の書き方を教えて頂きたいです。 # よろしくお願いします。 # # ●正規表現の使用環境 # VB.NET2003 # # ●検索か置換か? # 検索 # # ●説明 # 果物の名前を検索したい # # ●対象データ # 箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤 # 箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご # 箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm # # ●希望する結果 # メロン # みかん # バナナ # りんご # 対象データ('箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤\n箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご\n箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm\n'). 果物の名前を検索したい(_希望する結果) :- 対象データ(_対象データ), split(_対象データ,['\n'],Lines), append(_,[Line|R],Lines), sub_atom(Line,0,4,_,箱の中身), sPLIT(Line,['・','、','/'],L2), append(_,['/',_希望する結果|_],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/24 # # ●正規表現の使用環境 # C#.Net # # # ●検索か置換か? # 検索 # # # ●対象データ # data # (data # data) # (data) # Xdata # dataY # # ●希望する結果 # data # # # dataが()XY以外と隣接している場合は検索を一致させたくないのですが、 # それが中々できません。 # よろしくお願いします。 # # 'dataが()XY以外と隣接している場合は検索を一致させたくない'(_文字列,_前文字列,data,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,data,_後文字列,L1,L2,[A|R3]), \+(append(_,[A|_],['(',')','X','Y'])), \+((last(L1,B),append(_,[B|_],['(',')','X','Y']))). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/60 # # よろしくお願いします。 # # ●正規表現の使用環境 # PHP 5.2.9 (XAMPP 1.7.1) # # ●検索か置換か? # 検索 # # ●説明 # 入力文字が+、-、数字以外ならエラーを返す # # ●コード # preg_match("/^[+|-]*\d+$/g", $string) # (1行ごとに処理するので、/mは不要です) # # ●希望する結果 # +100→○ # -488→○ # 1024→○ # *300→× # /200→× # Aaaa→× # ああ→× # '入力文字が+、-、数字以外ならエラーを返す'(_入力文字列,エラー) :- atom_chars(_入力文字列,Chars), append(_,[_文字|_],Chars), '入力文字が+、-、数字以外'(_文字),!. '入力文字が+、-、数字以外ならエラーを返す'(_入力文字列,正常終了). '+、-、数字以外'('+') :- !,fail. '+、-、数字以外'('-') :- !,fail. '+、-、数字以外'(_入力文字) :- 数字(_入力文字),!,fail. '+、-、数字以外'(_). 数字('0'). 数字('1'). 数字('2'). 数字('3'). 数字('4'). 数字('5'). 数字('6'). 数字('7'). 数字('8'). 数字('9'). % 以下のサイトは # 正規表現だと、「当てはまる一部分を交換」ってのはやれるけど、 # 「当てはまる部分を含む一行を丸ごと交換」だと難しい。\ # っつーか思いつかんかった。やり方を。 当てはまる部分を含む一行を丸ごと交換(_文字列,_検索部分文字列,_置換行,_置換された文字列) :- atom_chars(_文字列,Chars), atom_chars(_検索部分文字列,_検索部分文字ならび), atom_chars(_置換行,_置換文字ならび), 当てはまる行を丸ごと交換(Chars,_検索部分文字ならび,_置換文字ならび,Chars2), concat_atom(Chars2,_置換された文字列),!. 当てはまる行を丸ごと交換([],[],_検索部分文字ならび,_置換文字ならび,[]) :- !. 当てはまる行を丸ごと交換([],L1,_検索部分文字ならび,_置換文字ならび,L1) :- \+(append(_,_検索部分文字ならび,_,L1)),!. 当てはまる行を丸ごと交換([],L1,_検索部分文字ならび,_置換文字ならび,_置換文字ならび) :- append(_,_検索部分文字ならび,_,L1),!. 当てはまる行を丸ごと交換(['\n'|R1],[],_検索部分文字ならび,_置換文字ならび,['\n'|R2]) :- 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2). 当てはまる行を丸ごと交換(['\n'|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- append(_,_検索部分文字ならび,_,L1), 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2), append(_置換文字ならび,['\n'|R2],Chars2),!. 当てはまる行を丸ごと交換(['\n'|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- \+(append(_,_検索部分文字ならび,_,L1)), 当てはまる行を丸ごと交換(R1,[],_検索部分文字ならび,_置換文字ならび,R2), append(L1,['\n'|R2],Chars2),!. 当てはまる行を丸ごと交換([A|R1],L1,_検索部分文字ならび,_置換文字ならび,Chars2) :- \+(A='\n'), append(L1,[A],L2), 当てはまる行を丸ごと交換(R1,L2,_検索部分文字ならび,_置換文字ならび,Chars2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/121 # # ●正規表現の使用環境 # Apache RewriteRule # # ●検索か置換か? # 検索 # # ●説明 # 1〜5つのカンマ区切りの単語を一致させたい # 連結数は不定 # # ●対象データ # apple # apple,orange,pineapple,grape,melon # orange,pineapple,melon # # ●希望する結果 # ○apple # ○orange,pineapple,melon # × ,apple # # 不定数連結されたパターンに悩んでいます # '1〜5つのカンマ区切りの単語を一致させたい'(_文字列,_前文字列,_適合文字列,_後文字列) :- 'カンマを0-4個含むアルファベット文字列'(_文字列,_前文字列,_適合文字列,_後文字列), カンマは独立して4個以内で先頭と末尾はカンマではない(_適合文字列). 'カンマを0-4個含むアルファベット文字列'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), アルファベットならび(L1,L2,L3). アルファベットならび([],L2,[]) :- 全ての要素がアルファベット(L2),!. アルファベットならび([],L2,[A|_]) :- 全ての要素がアルファベット(L2), \+(アルファベット(A)),!. アルファベットならび(L1,L2,L3) :- last(L1,A), L3 = [B|_], \+(アルファベット(A)), \+(アルファベット(B)), 全ての要素がアルファベット(L2),!. 全ての要素がアルファベット(L2) :- \+((append(_,[A|_],L2),アルファベット(A))). アルファベット(A) :- char_code(A,Code), Code > 32. カンマは独立して4個以内で先頭と末尾はカンマではない(_適合文字列) :- sPLIT(_適合文字列,[','],L), count(append(_,[','|_],L),N), N =< 4, カンマは独立して(L), 先頭はカンマでない(L), 末尾はカンマでない(L). カンマは独立して(L) :- \+(append(_,[',',','|_],L)),!. 先頭はカンマでない(L) :- \+([','|_]=L). 末尾はカンマでない(L) :- \+(append(_,[','],L)). % 以下のサイトは # 出題場所 http://hibari.2ch.net/test/read.cgi/tech/1301067486/144 # (本文が長すぎるというメッセージが出るので2つに分けています) # # ●正規表現の使用環境 # ActionScript 3.0 # # ●検索か置換か? # 検索 # # ●説明 # 文字列の先頭が「プラス符号かマイナス符号か数字か」と # 末尾が「数字か」でBoolean判定を行いたい。 # # ●対象データ # 1.2345  +123.45  -3.1245  青3.1245  3.1245赤 # # ●希望する結果 # 1.2345→true  +123.45→true  -3.1245 → true  青3.1245→false  3.1245赤→false # # # 試したコードは下記です。 # var patt0 = new RegExp("^(\d|[-]|[+])");//先頭部分の判定 # var patt1 = new RegExp("\d$");//末尾 # if (patt0.test(str0) == true && patt1.test(str0) == true) { # //trueと出力 # } else { # //falseと出力 # } # # 最初と最後の文字のみに注目しているのでフラグ("g"など)は無しにして # いますが、上の記述だと 1.2345 でもfalseが出力されます。 # # どう変えれば良いでしょうか? # 因みに、ActionScriptはJavaScriptと同じECMAスクリプトを起源にしています。 # (正規表現も共通点が多いようです) # 数値文字(['0','1','2','3','4','5','6','7','8','9']). 文字列の先頭が「プラス符号かマイナス符号か数字か」と末尾が「数字か」でBoolean判定を行う(_文字列) :- 数値文字(L), sub_atom(_文字列,0,1,_,_先頭), sub_atom(_文字列,_,1,0,_末尾), append(_,[_先頭|_],['+','-'|L]), append(_,[_末尾|_],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値文字(['0','1','2','3','4','5','6','7','8','9']). 文字列の先頭が「プラス符号かマイナス符号か数字か」と末尾が「数字か」でBoolean判定を行う(_文字列) :- atom_chars(_文字列,Chars), append([_先頭|_],[_末尾],Chars), 数値文字(L), append(_,[_先頭|_],['+','-'|L]), append(_,[_末尾|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/177 # # [1]C言語 # [2]本文 # 文字列を置換するプログラム # <条件> # ・右記の配列を使用 char str1[] str2[] syougou[] chikan[] # ・str1を先頭からコピーしてstr2を作る # このときstr1にsyougouと一致する文字列があればその文字列を見つける毎に文字列chikanに置換 # # 実行例: #     対象文字列を入力してください(str1):aabcabb #     照合文字列を入力してください(syougou):ab #     置換文字列を入力してください(chikan):ABC #     結果文字列は aABCcABCb です # 'str1を先頭からコピーしてstr2を作る。このときstr1にsyougouと一致する文字列があればその文字列を見つける毎に文字列chikanに置換' :- write('対象文字列を入力してください(str1):'), get_line(_str1), write('照合文字列を入力してください(syougou):'), get_line(_syougou), write('置換文字列を入力してください(chikan):'), get_line(_chikan), 文字列を置換する(_str1,_syougou,_chikan,_str2). 文字列を置換する(_str1,_syougou,_chikan,_str2) :- sub_atom(_str1,_,_,_,S1,_syougou,S3,_,_,_), 文字列を置換する(S3,_syougou,_chikan,_str3), concat_atom([S1,_chikan,_str3],_str2),!. 文字列を置換する(_str,_,_,_str). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を置換する(_str1,_syougou,_chikan,_str2) :- sub_atom(_str1,St1,Len,R,_syougou), sub_atom(_str1,0,St1,_,_str0), St3 is St1 + Len, sub_atom(_str1,St3,R,0,_str3), 文字列を置換する(_str0,_str3,_syougou,_chikan,_str3), concat_atom([_str0,_chikan,_str3],_str2),!. 文字列を置換する(_str,_,_,_str). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/156 # # ●正規表現の使用環境 # PHP 5.1 # # ●検索か置換か? # 検索 # # ●説明 # 角括弧が対応する始点から終点までをすべて抽出したいです。 # # ●対象データ # ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] # # ●希望する結果 # ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] #   1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   2^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^ # # ご教授よろしくお願いします。 # 角括弧が対応する始点から終点までをすべて抽出したい(_文字列,_抽出文字列ならび) :- atom_chars(_文字列,Chars), 文字ならびから角括弧抽出(Chars,_抽出文字列ならび). 文字ならびから角括弧抽出([],[]) :- !. 文字ならびから角括弧抽出(['['|R1],[_副文字列|R2]) :- 対応する閉じ括弧まで抽出(R1,L1,R), atom_chars(_副文字列,['['|L1]), 文字ならびから角括弧抽出(R,R2). 文字ならびから角括弧抽出([_|R1],L) :- 文字ならびから角括弧抽出(R1,L). 対応する閉じ括弧まで抽出([],[],[]) :- !. 対応する閉じ括弧まで抽出([']'|R1],[']'],R1) :- !. 対応する閉じ括弧まで抽出(['['|R1],L,R) :- 対応する閉じ括弧まで抽出(R1,L2,R2), 対応する閉じ括弧まで抽出(R2,L3,R), append(['['|L2],L3,L),!. 対応する閉じ括弧まで抽出([A|R1],[A|R2],R) :- 対応する閉じ括弧まで抽出(R1,R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/374 # # [1]授業単元:オペレーティングシステム論 # [2]課題:適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。 # それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する。 # これを10万回繰り返すプログラムを作成し、HD、SSD、USBフラッシュメモリ等のデバイスの差 # 処理時間がどのくらい変わるかテストするプログラムを作成せよ # [3] OS:Windows IDE:Visual studio 2008 言語:C # [4] 6/15まで # [5] ディスクキャッシュが大きいとディスクに短期間では確実に書き込まれるとは限らないので、ファイルを100個作って1000回 # 繰り返すプログラムにしたほうが良い # とのことです。 # コードだけでなく、実行時間もお願いします。 # # '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する' :- '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream), それをクローズし(Outstream), 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File). '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream) :- tmpnam(File), open(File,write,Outstream,[type(binary)]), for(1,N,100000000), Code is random(256), put_byte(Outstream,Code), N = 100000000,!. それをクローズし(Outstream) :- close(Outstream). 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File) :- open(File,update,Updatestream,[type(binary)]), repeat, ( at_end_of_stream(Updatestream); get_byte(Updatestream,Byte), Byte1 is Byte - 255, put_byte(Updatestream,Byte1), fail ), close(Updatestream). % 以下のサイトは # 順列の積の定義 # 順列 L1 L2 の積を L3 とするとき、置換群 G(S) の積の定義 # 数学的な記法で [L1(1),L1(2), ... ,L1(n)] = L1 * [1,2, ... ,n]. # を述語 順列の積 として、再帰的に定義する。 順列の積(_,[],[]) :- !. 順列の積(L1,[I],[J]) :- arglist(I,L1,J),!. 順列の積(L1,[I|R2],[J|R3]) :- arg_list(I,L1,J),!, 順列の積(L1,R2,R3). arg_list(K,Y,M) :- PY =.. [pred|Y], arg(K,PY,M). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/168 # # よろしくお願いします # # ●正規表現の使用環境 # PHP # # ●検索か置換か? # 置換 # # ●説明 # いくつか連続した\nを、すべて<br />に置換 # # ●対象データ # \n # \n\n\n # (連続数は1〜n) # # ●希望する結果 # <br /> # <br /><br /><br /> # # # 'いくつか連続した改行を、すべてhtmlの改行指定に変換'(_文字列,_変換された文字列) :- atom_codes(_文字列,Code1), コードならびの改行をすべてhtmlの改行指定に変換(Code1,Code2), atom_codes(_変換された文字列,Code2). コードならびの改行をすべてhtmlの改行指定に変換([],[]). コードならびの改行をすべてhtmlの改行指定に変換([10|R1],[60,47,98,114,62|R2]) :- コードならびの改行をすべてhtmlの改行指定に変換(R1,R2),!. コードならびの改行をすべてhtmlの改行指定に変換([Code|R1],[Code|R2]) :- コードならびの改行をすべてhtmlの改行指定に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/200 # # ●正規表現の使用環境 # VBScript # # ●検索か置換か? # 検索 # # ●説明 # http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # だけを変数に入れて、後で変数を利用したい # # ●対象データ # </style> # # <META HTTP-EQUIV="Refresh" CONTENT="1;URL=http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip"> # </HEAD> # # ●希望する結果 # 適当な変数=http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # 例:もし変数 var5 とかにとんこつ.zipを代入できるなら # WScript.Echo var5 # としたときにhttp://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # と出力できるようにしたいです。 # # もし上手く説明できてなかったらごめんなさい。 # よろしくお願いします。 # # 'URLを検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[h,t,t,p,:,/,/|R2],[' '|R3]), \+(sub_atom(S2,_,1,_,' ')), \+(append(_,[h,t,t,p,:,/,/|_],R2)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/858 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行の入力は、すべて英字とし、最大80文字とする。 # 初めに入力した1行の文字列に対して、2行目に入力した文字を3行目に入力した文字列に置換した文字列を作成し、結果を表示するプログラムを作成しなさい。 # '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して、2行目に入力した文字を3行目に入力した文字列に置換した文字列を作成し、結果を表示する' :- '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して'(_初めに入力した1行の文字列), '2行目に入力した文字を'(_2行目に入力した文字), '3行目に入力した文字列に'(_3行目に入力した文字列), '置換した文字列を作成し'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列), '結果を表示する'(_置換した文字列). '1行の入力は、すべて英字とし、最大80文字とする。初めに入力した1行の文字列に対して'(_初めに入力した1行の文字列) :- length(L1,80), '英字か改行文字の入力'(_英字か改行文字), '1行の入力は、すべて英字とし、最大80文字'(L1,_英字か改行文字,Chars), atom_chars(_初めに入力した1行の文字列,Chars). '1行の入力は、すべて英字とし、最大80文字'([],_,[]) :- !. '1行の入力は、すべて英字とし、最大80文字'(_,'\n',[]) :- !. '1行の入力は、すべて英字とし、最大80文字'([_|R1],_英字,[_英字|R2]) :- 英字の入力(_英字か改行文字2), '1行の入力は、すべて英字とし、最大80文字'(R1,_英字か改行文字2,R2). 英字か改行文字の入力(_英字か改行文字) :- get_char(Char), 英字か改行文字の入力診断(Char,_英字か改行文字),!. 英字か改行文字の入力(_英字か改行文字) :- 英字か改行文字の入力(_英字か改行文字). 英字か改行文字の入力診断('\n','\n') :- !. 英字か改行文字の入力診断(Char,Char) :- Char @>= 'a', char @=< 'z',!. 英字か改行文字の入力診断(Char,Char) :- Char @>= 'A', char @=< 'Z',!. 英字か改行文字の入力診断(Char,_) :- writef('%tは英字ではありません。この入力を無視します\n',[Char]), fail. '2行目に入力した文字を'(_2行目に入力した文字) :- get_char(_2行目に入力した文字). '3行目に入力した文字列に'(_3行目に入力した文字列) :- get_line(_3行目に入力した文字列). '置換した文字列を作成し'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列) :- atom_chars(_初めに入力した1行の文字列,Chars), '置換した文字ならびを作成し'(_初めに入力した1行の文字ならび,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字ならび), concat_atom(_置換した文字ならび,_置換した文字列). '置換した文字ならびを作成し'([],_,_,[]) :- !. '置換した文字ならびを作成し'([_2行目に入力した文字|R1],_2行目に入力した文字,_3行目に入力した文字列,[_3行目に入力した文字列|R4]) :- '置換した文字ならびを作成し'(R1,_2行目に入力した文字,_3行目に入力した文字列,R4). '置換した文字ならびを作成し'([_文字|R1],_2行目に入力した文字,_3行目に入力した文字列,[_文字|R4]) :- '置換した文字ならびを作成し'(R1,_2行目に入力した文字,_3行目に入力した文字列,R4). '結果を表示する'(_初めに入力した1行の文字列,_2行目に入力した文字,_3行目に入力した文字列,_置換した文字列) :- writef('初めに入力した1行の文字列 %t\n',[_初めに入力した1行の文字列]), writef('2行目に入力した文字 %t\n',[_2行目に入力した文字]), writef('3行目に入力した文字列 %t\n',[_3行目に入力した文字列]), writef('置換した文字列 %t\n',[_置換した文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/928 # # ../test/read.cgi/tech/1307166756/885に追加で # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込むファイル、ensyu07.cを作成せよ # replase_strings( ”file1”, ”file2”, ”string1”, ”string2” ) ; # # file1を読み込み、行の文字数の大きい順番に並び換え、file2に書き込むファイル、ensyu08.cを作成せよ # text_sort( ”file1”, ”file2” ) ; # # 出来れば../test/read.cgi/tech/1307166756/900や../test/read.cgi/tech/1307166756/907のような形式で書いてもらえると助かります # 'file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込む' :- 'file1を読み込み'(_行ならび), '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび), file2に書きこむ(_置き換えられた行ならび). file1を読み込み(_行ならび) :- get_lines(file1,_行ならび). '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび) :- findall(_行1,( append(_,[_行|_],_行ならび), 置換対象文字列は置換する(_行,_string1,_string2,_行1)), _置換された行ならび). 置換対象文字列は置換する(_行,_string1,_string2,_置換された行) :- sub_atom(_行,_,_,_,S1,_string1,S3,_,_,_), 置換対象文字列は置換する(S3,_string1,_string2,_行2), concat_atom([S1,_string2,_行2],_置換された行),!. 置換対象文字列は置換する(_行,_,_,_行). file2に書き込む(_行ならび) :- open(file2,write,Outstream), append(_,[_行|R],_行ならび), writef('%t\n',[_行]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/220 # # ●正規表現の使用環境 # grepとかegrepとか # # ●検索か置換か? # 検索 # # ●説明 # a,nの2文字のみが含まれる行を検索したい # # ●対象データ # aaa # ann # nana # anana # sin # anans # # ●希望する結果 # 上4つのみ出力 # 下二つは引っかからない # # 'a,nの2文字のみが含まれる行を検索したい'(_行ならび,_行) :- append(_,[_行|_],_行ならび), findsetof(_文字,sub_atom(_行,_,1,_,_文字),[a,n]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/236 # # 英数字プラスセミコロンはとれるのですが英数字の桁数が{3}をつけてもうまくいかず悩んでいます。 # # # ●正規表現の使用環境 # VBA # # ●検索か置換か? # 検索 # # ●説明 # 対象データのフォーマットチェックをしたいです # # A01;B02;C03;… # 英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します # 一番最後にはセミコロンはつきません # # ●対象データと希望する結果 # A01;B02;C03 →true # A01;B02;C03; →false # A01;B092;C03 →false # '英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します。一番最後にはセミコロンはつきません'(_文字列,true) :- R2 = [A,B,C,';'], \+(member(';',L1)), \+(member(';',L3)), すべてが英数字([A,B,C]),!. '英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します。一番最後にはセミコロンはつきません'(_文字列,false). すべてが英数字([]) :- !. すべてが英数字([A|R]) :- A @>= 0, A @=< 9, すべてが英数字(R). すべてが英数字([A|R]) :- A @>= 'A', A @=< 'Z', すべてが英数字(R). すべてが英数字([A|R]) :- A @>= 'a', A @=< 'z', すべてが英数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/244 # # よろしくお願いします。 # # ●正規表現の使用環境 # JavaScript # # ●検索か置換か? # 検索 # # ●説明 # xという文字から、xという文字までの取得 # ただしyxというパターンが含まれている場合は飛ばして、次のxを探す # x((?!yx).)*xを試しましたが、途中で検索が打ち切られて思うようになりません # # ●対象データ # "ab\"c",'def' # # ●希望する結果 # "ab\"c" # # 'xという文字から、xという文字までの取得。ただしyxというパターンが含まれている場合は飛ばして、次のxを探す'(_x,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_x|R1],L3), append(L0,[_x],R1), 許容(_x,L0). 'xという文字から、xという文字までの取得。ただしyxというパターンが含まれている場合は飛ばして、次のxを探す'(_x,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_,_,_後文字列_2,L1,[_x|R1],L3), append(L0,[_x],R1), 許容(_x,L0), 'xという文字から、xという文字までの取得。ただしyxというパターンが含まれている場合は飛ばして、次のxを探す'(_x,_後文字列_2,_前文字列,_適合文字列,_後文字列). 許容(_,[]) :- !. 許容(A,[A|_]) :- !,fail. 許容(A,['\\',A|R]) :- 許容(R). 許容(A,[_|R]) :- 許容(A,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/456 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://codepad.org/dx3nSGGc # # //盤面データ構造体 # struct aa_t { # int cell[9][9]; # }; # # ・(r,c)に数字kは入らないとする関数 # マス(r,c)に9ビットの状態数が与えられています。 # たとえば110101110のとき、kが2なら、この関数によって110101100というようにします。 # このとき、元から0であり変更がなかったなら0を、1を0に変更したら1を返すようにします。 # int aa_del(struct aa_t *s, int r, int c, int k) { # if((s->cell[r][c] & (0001 << (k-1))) == 0000){return 0;} # else {s->cell[r][c] = (s->cell[r][c] & ( ~(0001 << (k-1)) ) );return 1;} # } # # ・横一列に同じ数字は入り得ないとする関数 # (r,c)には1~9のいずれかの数字が入ります。 # たとえば(r,c)のマスに3,6,9の数字が入る可能性がある事を100100100という状態数で表しています。 # もし(r,c)の状態数が000000100となると、(r,c)に3が入ることが確定します。 # このときc列に3が入る可能性を消す関数です。(もちろん(r,c)以外の) # そしてこの関数で実際に変更を受けたマスの数を戻り値として返すようにします。 '(r,c)に数字kは入らない'(_r,_c,_k,LL1,LL2,_b) :- findall(N,( bit_n(M,N), \+(M=_k)), L), sum(L,S), nth1(_r,LL1,L1), nth1(_c,L1,_b), _b2 is _B \/ S, '行列の置換'(_r,_c,_b2,LL1,LL2),!. '横一列に同じ数字は入り得ない'(_r,_c,_k,LL1,LL2) :- 'kを否定する為の数'(_k,S), 転置して列のビット処理(LL1,_r,_c,_k,S,LL2). 'kを否定する為の数'(_k,S) :- findall(N,( bit_n(M,N), \+(M=_k)), L), sum(L,S),!. 転置して列のビット処理(LL1,_r,_c,_k,S,LL2) :- 転置(LL1,LL3), 行とカラムを得る(LL3,_c,_r,L3,_b), 行全体のビットオフ(L3,S,L2), 指定カラムだけビットオン(L2,_k,_b,_b3,L4), 要素位置指定によるならびの置換(LL3,_c,L4,LL4), 転置(LL4,LL2),!. 行とカラムを得る(LL,_r,_c,L,_b) :- nth1(_r,LL,L), nth1(_c,L,_b),!. 行全体のビットオフ(L3,S,L2) :- findall(_b2,( member(I,L3), _b2 is I /\ S), L2),!. 指定カラムだけビットオン(L2,_k,_b,_b3,L4) :- bit_n(_k,J), _b3 is _b \/ J, 要素位置指定によるならびの置換(L2,_r,_b3,L4),!. bit_n(0,0). bit_n(1,1). bit_n(2,2). bit_n(3,4). bit_n(4,8). bit_n(5,16). bit_n(6,32). bit_n(7,64). bit_n(8,128). bit_n(9,256). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/256 # # よろしくお願いします。 # ●正規表現の使用環境 # Ruby # ●検索か置換か? # 検索 # ●説明 # 株価のみを抜出し、DBに入れていく予定でいます。 # ●対象データ # http://ime.nu/stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T # のソースから # # ●希望する結果 # 2011年6月30日 # 3,010 # 3,050 # 2,986 # 3,030 # 8,376,600 # 3,030 # . # . # . # 日付、始値、高値、安値、終値、出来高、調整後終値 # です。 # http://ime.nu/stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T # . # . # . # <td>2011年6月30日</td> # <td>3,010</td> # <td>3,050</td> # <td>2,986</td> # <td>3,030</td> # <td>8,376,600</td> # <td>3,030</td> # . # . # このページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出すにはどうしたらよいでしょうか? # 2011年6月30日 # 3,010 # 3,050 # 2,986 # 3,030 # 8,376,600 # 3,030 # . # . # . # . # # 言語はRubyで、([^<>]+)などで色々やってみましたが、どうにもうまく抜き出せません。 # また、webのHTMLから、正規表現である程度特定して文字列を抜き出し、 # その特定して抜き出した文字列に再度正規表現で、文字列を特定していくという # 方法は可能でしょうか? # よろしくお願いします。 # 'ページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出す'(WebURL,_日付か株価) :- get_lines(WebURL,Lines), 日付と株価行を絞り込む(Lines,Lines2), 絞り込んだ日付と株価行からデータ部分を切り取る(Lines2,_日付か株価). 日付と株価行を絞り込む(Lines,Lines2) :- 日付と株価tableタグを捜す(Lines,R1), 日付と株価行のみ選別(R1,Lines2). 日付と株価tableタグを捜す(Lines,R1) :- append(_,[Line1|R1],Lines), sub_atom(Lines,0,7,_,''),!,fail;true)), Lines2),!. 絞り込んだ日付と株価行からデータ部分を切り取る(Lines2,_日付か株価) :- append(_,[Line2|_],Lines2), sub_atom(Line2,0,4,_,'
'), sub_atom(Line2,4,_,5,_日付か株価). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/266 # # ●正規表現の使用環境 # PHP 5.2.5 # # ●検索か置換か? # 置換 # # ●説明 # <a>でリンクされていないURLだけをリンクしたい # # ●対象データ # <a href='http://ime.nu/aaaaaa/aaa'>http://aaaaaa/aaa</a> # <a href='http://ime.nu/aaaaaa/aaa'>bbb</a> # http://ime.nu/aaaaaa/aaa # http://ime.nu/aaaaaa/aaa # # (httpの前に改行は無いです) # # ●希望する結果 # # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # <a href="http://ime.nu/aaaaaa/aaa">bbb</a> # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # <a href="http://ime.nu/aaaaaa/aaa">http://ime.nu/aaaaaa/aaa</a> # # # ↓これではダメでした。。 # /((?![\"\'>])(https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)(?![\"\'<]))/ # 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [<,a,>|R1], append(R0,[<,/,a,>],R1), \+(append(_,[<,a,>|_],R0)), \+(append(_,[<,/,a,>|_],R0)), 'AタグでリンクされていないURLだけをリンクしたい'(S3,_置換された文字列のニ), concat_atom([S1,S2,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [h,t,t,p,:,/,/|R1], member(C,R1), \+(member(C,[' ',',','\n'])), concat_atom([S1,'',S2,'\n'],S4), concat_atom([S4,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L1 = [h,t,t,p,:,/,/|R1], last(R1,C), member(C,[' ',',','\n']), concat_atom([S1,'',S2,'\n'],S4), 'AタグでリンクされていないURLだけをリンクしたい'(S3,_置換された文字列のニ), concat_atom([S4,_置換された文字列のニ],_置換された文字列),!. 'AタグでリンクされていないURLだけをリンクしたい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/279 # # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置換です # # ●説明 # HTMLファイルのソースコードの # <script type="text/javascript">〜省略〜</script> # scriptタグ開始を含めてscriptタグ終了タグまでを消去したいんです # # ●対象データ # <script type="text/javascript"> # <!-- # // 〜コメント〜 # 内容 # // --> # </script> # # <script type="text/javascript" src="script.js"></script> # # 上記のどちらも以下のものでやったのですが、どうもヒットしません # <script\s[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#'""]+>[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#]+\</script> # # 解答よろしくお願いします # # 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,s,c,r,i,p,t,' '|R2], append(R20,[/,s,c,r,i,p,t,>],R2), \+(append(_,[<,s,c,r,i,p,t,' '|_],R20)), \+(append(_,[/,s,c,r,i,p,t,>|_],R20)), 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(S3,_置換された文字列2), concat_atom([S1,_置換された文字列2],_置換された文字列),!. 'scriptタグ開始を含めてscriptタグ終了タグまでを消去'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/290 # # ●正規表現の使用環境 # Emacs Lisp # # ●検索か置換か? # 検索 # # ●説明 # C++などでよく使われる構文にマッチさせたい。 # 具体的にはクラスインスタンスへのアクセスアローやドットにマッチさせたい。 # # ●対象データ # # class A; # A a; # A* a_ref = &a; # # a.m_hoge; # a->m_hoge; # # ●希望する結果 # これにマッチさせる場合 # "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" # が正解らしいですが # なぜ正解かわからない部分があるので教えてください。 # まず"?"演算子の使い方ですが・・・直前の文字列(空文字込み)にマッチさせるために置いてあるとして # 直後の ":"が理解不能です。 # 後半でも、":"が出てきますがこれも不可解。名前空間の"::"などにマッチさせたいのであれば # ::や:?:とかならわかるのですが・・ # 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_クラス,CharsL), sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), \+((last(L1,C),アルファベット(C))), last(L2,';'), アローやドットにマッチさせる(ClassL,R2,L2). 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_クラス,CharsL), sub_atom(_文字列,_,_,_,_,_,_後文字列2,L1,L2,L3), \+((last(L1,C),アルファベット(C))), last(L2,';'), アローやドットにマッチさせる(ClassL,R2,L2), 'クラスインスタンスへのアクセスアローやドットにマッチさせる'(_クラス,_後文字列2,_前文字列,_適合文字列,_後文字列). アローやドットにマッチさせる(ClassL,R2,L2) :- append(ClassL,[-,>|R2],L2), 全てアルファベット(R2). アローやドットにマッチさせる(ClassL,R2,L2) :- append(ClassL,['.'|R2],L2), 全てアルファベット(R2). アルファベット(C) :- C @>= a, C @=< z,!. アルファベット(C) :- C @>= 'A', C @=< 'Z',!. アルファベット(C) :- C @>= '0', C @=< '9',!. 全てアルファベット([]). 全てアルファベット([C|R]) :- アルファベット(C), 全てアルファベット(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/293 # # ●正規表現の使用環境 # LINUX grepコマンド # # ●検索か置換か? # 検索 # # ●説明 # ドットで行に一文字追加されたもののみ検索したい # # ●対象データ # ABC # ABCD # ABCDE # # ●希望する結果 # ABCD # # grep ABC. sample.txtとしても # 結果 2文字追加されているABCDEまで出てきてしまいます。。。 # ドットは一文字と習ったのですが、 # なぜなのかわかりません・・。 # # ドットで行に一文字追加されたもののみ検索したい(_検索文字,_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,L2,['\n'|_]), atom_chars(_検索文字,L), append(L,[_],L2), \+(member('\n',L)). ドットで行に一文字追加されたもののみ検索したい(_検索文字,_文字列,_前文字列,_適合文字列,_後文字列). sub_atom(_文字列,_,_,_,_,_,_後文字列のニ,_,L2,['\n'|_]), atom_chars(_検索文字,L), append(L,[_],L2), \+(member('\n',L)), ドットで行に一文字追加されたもののみ検索したい(_検索文字,_後文字列のニ,_前文字列,_適合文字列,_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/297 # # お願いします # # ●正規表現の使用環境 # Hex Editor Neo # # ●検索か置換か? # 検索 # # ●説明 # 1文字目と3文字目が同じで、2文字と目と4文字目が同じの4文字の文字 # # ●対象データ # ABAB # PAPA # 0101 # # # '1文字目と3文字目が同じで、2文字と目と4文字目が同じの4文字の文字'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,[A,B,A,B],_), \+(A=B). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/381 # # ●正規表現の使用環境 # C# 4.0 # # ●検索か置換か? # 置き換え # # ●説明 # html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換えたい # ためしに<dd>とだけやってみましたが、<dd>タグは置き換えされませんでした # # ●対象データ # <dd>文章1</dd> # <dd>文章2</dd> # # ●希望する結果 # 文章1 # 文章2 # 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), atom_chars(_ddタグを削除された文字列,L11), concat_atom([L1,L11,L2],_置換された文字列). 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[<,d,d,>|R1],L3), append(_[/,<,d,d,>|_],L1), append(L11,[/,<,d,d,>],R1), \+(append(L11,[/,<,d,d,>],L11)), 'html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換える'(L3,_置換された文字列のニ), concat_atom([L1,L11,_置換された文字列のニ],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/403 # # ●正規表現の使用環境 # Excel VBA # # ●検索か置換か? # 置換 # # ●説明 # <>で囲まれた文字列を空白に置換したい。 # # ●対象データ # あいうえお<ほげほげ>かきくけこ # みかん<りんご<すいか>ぶどう>メロン # # ●希望する結果 # あいうえおかきくけこ # みかんメロン # # --- # 検索:<*> # 置換: # --- # というふうにすると、 # 一番目の例に対してはうまくいくのですが、入れ子になっている場合にうまくいきません。 # ↓のような結果になってしまいます。 # みかんぶどう>メロン # # # お願いします。 # # '<>で囲まれた文字列を空白に置換したい。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), 'ならびの<>で囲まれた部分を空白に置換したい。'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). 'ならびの<>で囲まれた部分を空白に置換したい。'([],[]). 'ならびの<>で囲まれた部分を空白に置換したい。'([<|R1],L) :- '<>に囲まれた部分を置換する'(R1,L1,R2), 'ならびの<>で囲まれた部分を空白に置換したい。'(R2,L2), append(L1,L2,L),!. 'ならびの<>で囲まれた部分を空白に置換したい。'([A|R1],[A|R2]) :- 'ならびの<>で囲まれた部分を空白に置換したい。'(R1,R2). '<>に囲まれた部分を置換する'([>|R],[],R) :- !. '<>に囲まれた部分を置換する'([<|R1],L,R) :- '<>に囲まれた部分を置換する'(R,L1,R1), '<>に囲まれた部分を置換する'(R1,L2,R), append(L1,L2,L),!. '<>に囲まれた部分を置換する'([A|R1],[A|R2],R) :- '<>に囲まれた部分を置換する'(R1,R2,R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/418 # # テキスト中の行頭 ; という記号を置き換えようしています # '^\;'とかいたらマッチしません # # 次に ^\;.* と書いたらマッチするものの # 行頭に;がある行の一列すべてがマッチしてしまいます # # 一体どう書けばよいのでしょうか? # # 'テキスト中の行頭 ; という記号を置き換えようしています'(_文字列,_置換文字列,_置換された文字列) :- atom_chars(_文字列,Chars), atom_chars(_置換文字列,Chars2), 'ならびの行頭位置にある ; という記号を置換'(Chars,Chars2,L), atom_chars(_置換された文字列,Chars3). 'ならびの行頭位置にある ; という記号を置換'([';'|R1],Chars2,L) :- append(Chars2,R1,L),!. 'ならびの行頭位置にある ; という記号を置換'(Chars1,Chars2,L) :- 'ならびの行頭位置にある ; という記号を置換のニ'(Chars1,Chars2,L). 'ならびの行頭位置にある ; という記号を置換のニ'([],_,[]) :- !. 'ならびの行頭位置にある ; という記号を置換のニ'(['\n',';'|R1],Chars2,L) :- 'ならびの行頭位置にある ; という記号を置換のニ'(R1,Chars,R2), append(Chars2,R2,L),!. 'ならびの行頭位置にある ; という記号を置換のニ'([A|R1],Chars2,[A|R2]) :- 'ならびの行頭位置にある ; という記号を置換のニ'(R1,Chars,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/444 # # よろしくお願いします # # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # ダブルクォーテーションの中の文字を空白扱いにしたい # # ●対象データ # test="daikon" # test="daikon ninjin" # test="daikon ninjin tamanegi" # # ●希望する結果 # test="" # test="" # test="" # # 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_置換対象文字列,_,L1,['"'|R2],['"'|R3]), \+(member('"',R2)), atom_chars(_残り文字列,R3), concat_atom([_前文字列,'""',_残り文字列],_置換された文字列). 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_置換対象文字列,_,L1,['"'|R2],['"'|R3]), \+(member('"',R2)), atom_chars(_残り文字列,R3), 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_残り文字列,_置換された文字列のニ), concat_atom([_前文字列,'""',_置換された文字列のニ],_置換された文字列). 'ダブルクォーテーションの中の文字を空白扱いにしたい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/455 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # <b></b>で挟まれた文章を抜き出す # # ●対象データ # <table width="100%" border="1" cellspacing="0" cellpadding="10"> # <tr><td><b>ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。</b></td></tr> # </table> # # ●希望する結果 # ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。 # # ==== # これを実行するのに、 # responseStr = System.Text.RegularExpressions.Regex.Replace( # responseStr, # @"(.|\n)*<b>(?<sentence>.*?)</b>(.|\n)*", # "${sentence}"); # # とやっているのですが、 # 「任意の一文字(改行文字も含む)」 # という表現は(.|\n)が最適なのでしょうか。 # もっとベターなやりかたがあったら教えて下さい。 # # 'で挟まれた文章を抜き出す'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append([<,b,>|R1],[<,/,b,>],R1), \+(append(_,[<,b,>|_],R1)), \+(append(_,[<,/,b,>|_],R1)), atom_chars(_適合文字列,R1), concat_atom([S1,''],_前文字列), concat_atom(['',S3],_後文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/468 # # 「ecv 0000 ef773s 1111 87ed93」と言った数字、文字、スペースが混ざった文字列から # 数字だけのブロック("0000"と"1111")を取り出したい場合のパターンを教えてください。 # # 自分で思いつくのは下記。もっとスマートなやりかたないでしょうか # 1.\s→\r\nに置換 # 2.^(\d+)$→●$1に置換 # 3.^[^●].*$→空白に置換 # 4.●→空白に置換 # # ちなみにサクラエディタです。 # よろしくお願いいたします。 # '数字だけのブロック("0000"と"1111")を取り出したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), すべて数字(L2), 'L1が空であるか最後の要素が空白または改行'(L1), 'L3が空であるか最初の要素が空白または改行'(L3). すべて数字([]) :- !. すべて数字([A|R]) :- member(A,['0','1','2','3','4','5','6','7','8','9']), すべて数字(R). 'L1が空であるか最後の要素が空白または改行'([]) :- !. 'L1が空であるか最後の要素が空白または改行'(L1) :- member(A,[' ','\n']), append(_,[A],L1),!. 'L3が空であるか最後の要素が空白または改行'([]) :- !. 'L3が空であるか最初の要素が空白または改行'([A|_]) :- member(A,[' ','\n']),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/477 # # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 検索 # # ●検索対照データ # (abcdefg:;[]あいうえお)) # # ●希望する結果 # (で始まり、途中にいろいろあっても、))で終わる対象データを検索したいです。 # すみませんが、よろしくお願いします。 # # '(で始まり、途中にいろいろあっても、))で終わる対象データを検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), append(['('],L22,[')',')'],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/482 # # どなたかご教授ください・・・ # ●正規表現の使用環境 # EmEditor # # ●検索か置換か? # 置換 # # ●対照データ # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[aa][zy]AC[ab] # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb] # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] # # ●希望する結果 # ;AA[ac][ad]・・・・・[zw][zx][zz];AB[aa][zy]AC[ab]     ←;AAの後ろから[aa][zy][ab]を削除 # ;AA[ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb]     ←;AAの後ろから[df][aa][fb]を削除 # ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg]    ←;AAの後ろから、[bc][fh][ge][eg]を削除 # # すみませんが、よろしくお願いします。 # # ';AAの後ろから削除文字列を削除'(_対象文字列,_削除文字列,_削除された文字列) :- sub_atom(_対象文字列,_,_,_,S1,S2,S3,L1,[';','A','A'|R2],L3), \+(member(';',R2)), concat_atom(R2,_削除文字列), concat_atom([S1,';AA',S3],削除された文字列). ';AAの後ろから削除文字列を削除'(_対象文字列,_削除文字列,_削除された文字列) :- sub_atom(_対象文字列,_,_,_,S1,S2,S3,L1,[';','A','A'|R2],L3), \+(member(';',R2)), concat_atom(R2,_削除文字列), ';AAの後ろから削除文字列を削除'(S3,_削除文字列,_削除された文字列のニ), concat_atom([S1,';AA',_削除された文字列のニ],_削除された文字列). ';AAの後ろから削除文字列を削除'(_対象文字列,_,_対象文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/492 # # ●正規表現の使用環境 # vxeditor # # ●検索か置換か? # 置換 # # ●説明 # 「a」という文字を正規表現で検索し、「C:\test\test2」に置換するために、 # # 検索語:[a-z] もしくは \w # 置換語:C:\test\test2 # # と置換したのですが結果は「C:        est        est2」となってしまいます。 # 置換語を「C:\\test\\test2」としてみたら今度は「\test2」となりました。 # # ●対象データ # a # # ●希望する結果 # C:\test\test2 # # お願いします # # 'aという文字をC:\\test\\test2に置換する'(_文字列,_置換文字列) :- sub_atom(_文字列,_,_,_,S1,a,S3,L1,L2,L3), concat_atom([S1,'C:\\test\\test2',S3],_置換文字列). 'aという文字をC:\\test\\test2に置換する'(_文字列,_置換文字列) :- sub_atom(_文字列,_,_,_,S1,a,S3,L1,L2,L3), concat_atom([S1,'C:\\test\\test2'],_置換文字列の一), 'aという文字をC:\\test\\test2に置換する'(S3,_置換文字列のニ), concat_atom([_置換文字列の一,_置換文字列のニ],_置換文字列). 'aという文字をC:\\test\\test2に置換する'(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/745 # # Aの繰り返しはA+とかA{m,n}でマッチできますが、 # 繰り返された個数を元にAAAAAをA*5などに置換する「うまい」方法はあるでしょうか。 # # 言語はとりあえずJavaScriptで考えています。 # replace(/A+/g, 'A*'); //←ここから進まない。 # # '繰り返された個数を元にAAAAAをA*5などに置換する'(_文字列,_繰り返し対象文字,_繰り返し数) :- sub_atom(_文字列,_,_繰り返し数,_,S1,S2,S3,L1,L2,L3), all(L2,_繰り返し対象文字), \+(last(L1,_繰り返し対象文字)), \+(L3 = [_繰り返し対象文字|_]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/503 # # ●正規表現の使用環境 # oracle(regexp_replace) # ●検索か置換か? # 置換 # ●説明 # ::でタグ名が記載されたデータを<>タグに変換したい # ●対象データ # :dog:I like dog # :cat:I like cat # ●希望する結果 # <dog>I like dog</dog> # <cat>I like cat</cat> # '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_), concat_atom([S22,S31],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_残り文字列), concat_atom([S22,S31],_置換された文字列の一), '::でタグ名が記載されたデータを<>タグに変換したい'(_残り文字列,_置換された文字列のニ), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_文字列). '最初に現れたS21の後にを付加する'(_文字列,S21,S31,S3) :- sub_atom(_文字列,_,_,_,S1,S21,S3,L1,L2,L3), concat_atom([S1,S21,'<',S21,'>'],S31),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/538 # # ●正規表現の使用環境 Flexible Renamer # ●検索か置換か? 置換 # ●説明 # 日付の前の文字を入れ替える # ●対象データ # ABC11-12-31 \d{2}-[A-Z]{3}-\d{2} # ABC11-DEC-31 \d{2}-\d{2}-\d{2} # ABC2011-12-31 \d{4}-[A-Z]{3}-\d{2} # ABC2011-DEC-31 \d{4}-\d{2}-\d{2} # ●希望する結果 # XYZ11-12-31 # XYZ11-DEC-31 # XYZ2011-12-31 # XYZ2011-DEC-31 # ●コメント:こんな感じか書いて投稿してみた # 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), concat_atom([S1,S22,S3],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), 日付の前の文字を入れ替える(S3,_置換された文字列のニ), concat_atom([S1,S22],_置換された文字列の一), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_文字列). 年の文字ならび(R21) :- length(R21,4), すべて数字(R21),!. 年の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 月の文字ならび(R22) :- length(R22,1), すべて数字(R22),!. 月の文字ならび(R22) :- member(A,['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']), atom_chars(A,R22),!. 日の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 日の文字ならび(R21) :- length(R21,1), すべて数字(R21),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/541 # # ●正規表現の使用環境 # 一般社会 # # ●検索か置換か? # 検索 # # ●説明 # すぐにやれる女を見つけたいです # # ●対象データ # OL # 女子大生 # 女子高生 # キャバ嬢 # ヘルス嬢 # 近所のおばさん # 母親 # # ●希望する結果 # させこ # やりまん # 公衆便所 # すぐにやれる女(させこ). すぐにやれる女(やりまん). すぐにやれる女(公衆便所). 'すぐにやれる女を見つけたいです'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), すぐにやれる女(_適合文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/546 # # ●正規表現の使用環境 # Microsoft .NET Framework # # ●検索か置換か? # 検索 # # ●説明 # 下記条件(AND条件)のURLを検索したいです。 # ・特定のドメイン(yahoo.co.jp)がhttp://ime.nu/直後に含まれない。 # ・特定の拡張子(jpg,gif)で終わらない。 # # ●対象データ # 1.http://ime.nu/yahoo.co.jp/?=abc # 2.http://ime.nu/yahoo.co.jp/abc.jpg # 3.http://2ch.net/?=abc # 4.http://2ch.net/abc.jpg # ・・・など複数URL # # ●希望する結果 # 3のみを検索したいです。 # # よろしくお願いします。 # # '下記条件(AND条件)のURLを検索したいです。・特定のドメイン(yahoo.co.jp)がhttp://ime.nu/直後に含まれない。・特定の拡張子(jpg,gif)で終わらない。'(_対象文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_対象文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), sub_atom(適合文字列,0,7,_,'http://'), 'URLの終止条件'(L3), \+(排除条件(L2)). 'URLの文字種検査'([]) :- !. 'URLの文字種検査'([A|R]) :- アルファベット(A), 'URLの文字種検査'(R). 'URLの文字種検査'([A|R]) :- 数字(A), 'URLの文字種検査'(R). 'URLの文字種検査'([A|R]) :- 'URLに許される特定の英記号'(A), 'URLの文字種検査'(R). アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. 数字(A) :- A @>= '0', A @=< '9',!. 'URLに許される特定の英記号'(A) :- member(A,['%','&','=','_','-','.','/','~','#']),!. 'URLの終止条件'(['\n'|R3]) :- !. 'URLの終止条件'([' '|_]) :- !. 'URLの終止条件'(['\t'|_]) :- !. 排除条件([h,t,t,p,:,/,/,i,m,e,'.',n,u,/,y,a,h,o,o,'.',c,o,'.',j,p|_]) :- !. 排除条件([h,t,t,p,:,/,/|R]) :- append(_,[g,i,f],R),!. 排除条件([h,t,t,p,:,/,/|R]) :- append(_,[j,p,g],R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/563 # # ●正規表現の使用環境 # Perl5 or Javascript # # ●検索か置換か? # 検索 # # ●説明 # ダブルクオートに囲まれた文字列を取得したい # ただ、「\」の次の文字はエスケープされた文字として扱う # # ●対象データ # "hogefuga" # "hoge\"fuga" # "hoge\\"fuga" # # ●希望する結果 # hogefuga # hoge"fuga # hoge\ # # # 上記のようなありきたりな命題にトライしていたのですが、以下の正規表現のうち1ではうまくいくのに2ではうまくいきませんでした # 1. /"((?:(?:\\.)|[^"])*)"/ # 2. /"((?:[^"]|(?:\\.))*)"/ # # # ただ、僕にはこれが両方同じ意味に見えるのです # # なぜこの場合、2ではうまくいかないのでしょうか # 気になって眠れません # 詳しい方解説お願いします # # 'ダブルクオートに囲まれた文字列を取得したい。ただ、「\\」の次の文字はエスケープされた文字として扱う'(_対象文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_対象文字列,_,_,_,_前文字列,_,_後文字列,L1,L2,L3), sub_atom(_後文字列,0,1,_,'"'), sub_atom(_前文字列,_,1,0,'"'), '「\\」の次の文字はエスケープされた文字として扱う'(L2,Chars), atom_chars(_適合文字列,Chars). '「\\」の次の文字はエスケープされた文字として扱う'([],[]) :- !. '「\\」の次の文字はエスケープされた文字として扱う'(['"'|_],_) :- !,fail. '「\\」の次の文字はエスケープされた文字として扱う'(['\\',A|R1],[A|R2]) :- '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2),!. '「\\」の次の文字はエスケープされた文字として扱う'([A|R1],[A|R2]) :- '「\\」の次の文字はエスケープされた文字として扱う'(R1,R2). % 以下のサイトは # http://stackoverflow.com/questions/7542406/ # ここで私が何をしたいです。 # 私は文字のリストを持っている(基本的に単語)と私はアンダースコアで # 単語に母音を代入する['_']と新しいリストを返します。 # 例: # # ?- サブ([s,e,g,e,d],A). # A = [s,_,g,_,d] # ここで私が試みたが、述語から、それが終了するが、それがすべてを解体し、 # それが出力文字列なしで目標を見つけたことを宣言し呼び出すときに、 # それが最終的に折返しのために新しいリストを作成し、何です!... # 私が使用されるアルゴリズムは以下のとおりです。リストの要素を選択し、 # それが母音であるかどうかをチェックし、新しいリストに['_']または要素自体を # 追加。 '文字のリストの母音要素を一旦匿名変数に置き換え、その匿名変数を5つの母音で置換して得られる文字リスト'(_文字リスト,_母音を置換した文字列) :- 文字リストの母音要素を匿名変数に置き換える(_文字リスト,_母音を匿名変数に置換した文字列), 匿名変数に5つの母音で置換して得られる文字リスト(_母音を匿名変数に置換した文字列,_母音を置換した文字列). 匿名変数を5つの母音で置換して得られる文字リスト([],[]). 匿名変数を5つの母音で置換して得られる文字リスト([A|R1],[A|R2]) :- \+(var(A)), 匿名変数を5つの母音で置換して得られる文字リスト(R1,R2). 匿名変数を5つの母音で置換して得られる文字リスト([A|R1],[B|R2]) :- var(A), 母音(B), 匿名変数を5つの母音で置換して得られる文字リスト(R1,R2). 文字リストの母音要素を匿名変数に置き換える([],[]). 文字リストの母音要素を匿名変数に置き換える([A|R1],[A|R2]) :- \+(母音(A)), 文字リストの母音要素を匿名変数に置き換える(R1,R2). 文字リストの母音要素を匿名変数に置き換える([A|R1],['_'|R2]) :- 母音(A), 文字リストの母音要素を匿名変数に置き換える(R1,R2). 母音(a). 母音(e). 母音(i). 母音(o). 母音(u). % 以下のサイトは # http://stackoverflow.com/questions/7542406/ # ここで私が何をしたいです。 # 私は文字のリストを持っている(基本的に単語)と私はアンダースコアで # 単語に母音を代入する['_']と新しいリストを返します。 # 例: # # ?- サブ([s,e,g,e,d],A). # A = [s,_,g,_,d] # ここで私が試みたが、述語から、それが終了するが、それがすべてを解体し、 # それが出力文字列なしで目標を見つけたことを宣言し呼び出すときに、 # それが最終的に折返しのために新しいリストを作成し、何です!... # 私が使用されるアルゴリズムは以下のとおりです。リストの要素を選択し、 # それが母音であるかどうかをチェックし、新しいリストに['_']または要素自体を # 追加。 '文字のリストの母音要素を5つの母音で置換して得られる文字リスト'(_文字リスト,_母音を置換した文字列) :- 母音要素を5つの母音で置換する(_文字リスト,_母音を置換された文字列). 母音要素を5つの母音で置換する([],[]). 母音要素を5つの母音で置換する([A|R1],[A|R2]) :- \+(母音(A)), 母音要素を5つの母音で置換する(R1,R2). 母音要素を5つの母音で置換する([A|R1],[B|R2]) :- 母音(A), 母音(B), 母音要素を5つの母音で置換する(R1,R2). 母音(a). 母音(e). 母音(i). 母音(o). 母音(u). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/615 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 3 x 3 の行列の値が書かれたファイルを二つ用意する. この 2 つの行列の積を新しいファイルに書き出すプログラムを作成せよ. # (例えば, 行列 A を MatrixA.txt, 行列 B を MatrixB.txt と用意すると, プログラム実行後には行列 A と行列 B の積の値が ファイル MatrixC.txt に書き込まれているようにする.) # '3 x 3 の行列の値が書かれたファイルを二つ用意する. この 2 つの行列の積を新しいファイルに書き出す'(_入力ファイル1,_入力ファイル2,_出力ファイル) :- get_split_lines(_入力ファイル1,[',',' '],LL1), get_split_lines(_出力ファイル2,[',',' '],LL2), 行列の積(LL1,LL2,LL3), 新しいファイルに書きだす(_出力ファイル,LL3). 新しいファイルに書きだす(_出力ファイル,LL3) :- open(_出力ファイル,write,Outstream), append(_,[L|R],LL3), writef(Outstream,'%t,%t,%t\n',L), R = [], close(Outstream). 行列の積(L1,L2,X) :- 置換(L2,L4), 行列の積の一(L1,L4,X) . 行列の積の一([],_,[]) :- !. 行列の積の一([A|R1],L,[S1|R3]) :- 行列の積のニ(A,L,S1), 行列の積の一(R1,L,R3). 行列の積のニ(_,[],[]) :- !. 行列の積のニ(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C), 行列の積のニ(A,R2,R3). 行列の積の三([],[],0) :- !. 行列の積の三([A|R1],[B|R2],S) :- S1 is A * B, 行列の積の三(R1,R2,S2), S is S1 + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/594 # # 正規表現は、既出かどうかってのがわかりにくいね。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索 # # ●説明 # 変数文字列とその添字の取得 # # ●対象データ # $AAA.BBB+$CCC.DDD.EEE(1234)-#FFF*#GGG.HHH(567) # # ●希望する結果 # 検索1回目 # group1 : $AAA.BBB # # 検索2回目 # group1 : $CCC.DDD.EEE # group2 : 1234 # # 検索3回目 # group1 : #FFF # # 検索4回目 # group1 : #GGG.HHH # group2 : 567 # # # ($.*)\\(([0-9]*)\\) # これで、$CCC.DDD.EEE(1234)をみつけれるのは出来たけど、添え字が無い場合を引っ掛けるのができない。 # # '変数文字列とその添字の取得'(_文字列,_前文字列,_適合文字列,_後文字列,Group1,Group2) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,['$'|R2],L3), \+((member(A,R),member(A,['+','-','*','/']))), '[]であるか先頭に+,-,*,/,が来る'(L3), group検査(R2,Group1,Group2). '[]であるか先頭に+,-,*,/,が来る'([]) :- !. '[]であるか先頭に+,-,*,/,が来る'([A|_]) :- member(A,[+,-,*,/]),!. group検査(R2,Group1,'') :- \+(append(_,['('|_],R2)), atom_chars(Group1,R2),!. group検査(R2,Group1,Group2) :- atom_chars(Group1,R2), append(_,['('|R3],R2), append(L0,[')'|_],R3), atom_chars(Group2,L0),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/627 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf で n を受け取り, 要素数 n の乱数配列を作成し, 指定した 2 つの要素番号にある要素を交換するプログラムを作成せよ. # 'n を受け取り, 要素数 n の乱数ならびを作成し, 指定した 2 つの要素番号にある要素を交換する' :- 'n を受け取り'(_n), '要素数 n の乱数配列を作成し'(_n,_乱数ならび), '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび), 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),!. 'n を受け取り'(_n) :- write('要素数nを入力してください : '), get_line(Line), 'n受け取り検査'(Line,_n),!. 'n を受け取り'(_n) :- 'n を受け取り'(_n). 'n受け取り検査'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 'n受け取り検査'(Line,_n) :- writef('入力された%tからは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '要素数 n の乱数配列を作成し'(_n,_乱数ならび) :- length(_乱数ならび,_n), findall(_乱数,( append(_,[_乱数|_],_乱数ならび), _乱数 is random(100) + 1), _乱数ならび). '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2), '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび). '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- writef('2つの要素番号[1~%t]をカンマ区切りで入力してください : ',[_n]), get_line(Line), '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2). '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2) :- '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2), '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号入力検査'(Line,_要素番号_1,_要素番号_2) :- write('再入力をお願いします\n'), fail. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- split(Line,[','],[_要素番号_1,_要素番号_2]),!. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- writef('入力された%tからは2要素の要素番号が得られません。\n',[Line]), fail. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- _要素番号_1 > 0, _要素番号_1 =< _n, _要素番号_2 > 0, _要素番号_2 =< _n,!. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- writef('入力された要素には[1~%t]の範囲を逸脱しているものが有ります。\n',[Line,_n]), fail. '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- 要素番号を変数に置換(_乱数ならび,_要素番号_1,_元の値_1,_変数_1,_乱数ならびの一), 要素番号を変数に置換(_乱数ならびの一,_要素番号_2,_元の値_2,_変数_2,_2要素が交換された乱数ならび), _変数_1 = _元の値_2, _変数_2 = _元の値_1,!. 要素番号を変数に置換(_ならび,_要素番号,_元の値,_変数,_置換されたならび) :- length([_|L0],_要素番号), append(L0,[_元の値|R],_ならび), append(L0,[_変数|R],_置換されたならび). 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- writef('元の乱数ならびは: %t\n',[_乱数ならび]), writef('%t番目と%t番目の要素を交換する\n',[_要素番号_1,_要素番号_2]), writef('2要素が交換された乱数ならびは: %t\n',[_2要素が交換された乱数ならび]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/620 # # ●正規表現の使用環境 # Windowsコマンドプロンプト、filestr # # ●検索か置換か? # 検索 # # ●説明 # 全角英の大文字または小文字または全角数字が含まれているか検索したい # # ●対象データ # 以下batで失礼します # set a="Ape" # set b="Bape" # set c="222" # ●希望する結果 # %a%、%b%、%c%から検索して、"Ape"、"Bape"、"222"、という結果を表示できるようする正規表現または、それを含めたコマンド # ●試したコマンド # echo %a%|findstr /r "[A-Z]" # echo %b%|findstr /r "a-z" # echo %c%|findstr /r \[0-9\] # echo %c%|findstr /r "\[0-9\]" # echo %a%|findstr "[A-Z]" # echo %b%|findstr "a-z" # echo %c%|findstr a-z # findstr /r [A-Z] %a% # findstr /r [a-z] %b% # findstr /r [0-9] %c% # 上記のコマンドは間違っていて結果が全て空欄になっています。正しい場合は # set d=" あああ" # echo %d%|findstr /r /c:"^. ." # こちらの画面を見て頂ければと思います。それではどうかよろしくお願いします。 # # '全角英の大文字または小文字または全角数字が含まれているか検索する'(_文字列,_前文字列,_適合全角文字,_後文字列) :- atom_chars(_文字列,Chars), append(L0,[_適合全角文字|R],Chars), '全角英の大文字または小文字または全角数字が含まれているか'(_適合全角文字), atom_chars(_前文字列,L0), atom_chars(_後文字列,R). '全角英の大文字または小文字または全角数字が含まれているか'(A) :- '全角英の大文字が含まれている'(A),!. '全角英の大文字または小文字または全角数字が含まれているか'(L,L0,A,R) :- '全角英の小文字が含まれている'(A),!. '全角英の大文字または小文字または全角数字が含まれているか'(L,L0,A,R) :- '全角数字が含まれている'(A),!. '全角英の大文字が含まれている'(A) :- A @>= A, A @=< Z,!. '全角英の大文字が含まれている'(A) :- A @>= a, A @=< z,!. '全角英の数字が含まれている'(A) :- A @>= 1, A @=< 9,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/647 # # <hoge>aaa</hoge> # bbb # <hoge>ccc</hoge> # # <hoge></hoge>に囲まれてる文字を大文字に置き換える処理をしてるのですが、 # <hoge>(.*)</hoge>で一応できます。 # <hoge>(.*)?</hoge>と?をつけてもできるのですが、 # どっちが正しいのでしょうか? # # '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,h,o,g,e,>|R2], append(R22,[<,/,h,o,g,e,>],R2), findall(B,( member(A,R22), to_upper(A,B)), R23), concat_atom([<,hoge,>,R23,<,'/hoge',>],S23), concat_atom([S1,S23],_置換された部分までの文字列), concat_atom([S1,S23,S3],_置換された文字列_1), '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,S3,_置換された文字列_1,_置換された文字列). '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,_,_置換された文字列,_置換された文字列). '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,_後文字列,_置換された文字列,_置換された文字列) :- '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_後文字列,_置換された文字列_1), concat_atom([_置換された部分までの文字列,_置換された文字列_1],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/575 # # 学校で宿題が出ました、助けて下さい>< # 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 # よろしくお願いいたします。 # # 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 # テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような # パスを変数に代入する記述があった場合 # そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" # という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。 # '実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。テキストファイルの中に、pass = /Users/users/Documents/workspace/test.txt"というようなパスを変数に代入する記述があった場合そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ/test.txt"という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。'(_テキストファイル) :- pwd(CWDIR), get_chars(_テキストファイル,Chars_1), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2), put_chars(_テキストファイル,Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2) :- atom_chars(CWDIR,CWDIRL), パス部分を現在のディレクトリに置換する(CWDIRL,_chars_1,_前部分,_置換_後部分), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,_後部分,Chars_2_2), append(_前部分,_置換された部分,Chars_2_2,_Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars,Chars). パス部分を現在のディレクトリに置換する(Chars_1,_前部分,_置換された部分,_後部分) :- パス部分(_パス部分,_実質パス部分), append(_前部分,_パス部分,_後部分,Chars_1), ファイル部分(_実質パス部分,_ファイル部分), append([p,a,s,s,' ',=,' ','"'|CWDIRL],[/|_ファイル部分],['"'],_置換された部分),!. パス部分([p,a,s,s,' ',=,' ','"'|R],_実質パス部分) :- append(_実質パス部分,['"'],R), \+(member('"',_実質パス部分)),!. ファイル部分(_実質パス部分,_ファイル部分) :- append(_,[/|_ファイル部分],_実質パス部分), \+(member(/,_ファイル部分)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/575 # # 学校で宿題が出ました、助けて下さい>< # 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 # よろしくお願いいたします。 # # 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 # テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような # パスを変数に代入する記述があった場合 # そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" # という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。 # '実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。テキストファイルの中に、pass = /Users/users/Documents/workspace/test.txt"というようなパスを変数に代入する記述があった場合そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ/test.txt"という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。'(_テキストファイル) :- pwd(CWDIR), get_chars(_テキストファイル,Chars_1), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2), put_chars(_テキストファイル,Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2) :- atom_chars(CWDIR,CWDIRL), search_part_list(Chars_1,[<,p,a,s,s,' ',=,' ','"'],['"'],L0,L1,L2), パス部分を現在のディレクトリに置換する(CWDIRL,L1,L11), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,L2,Chars_2_2), append(L0,L11,Chars_2_2,Chars_2),!. 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars,Chars). パス部分を現在のディレクトリに置換する(CWDIRL,L1,L11) :- ファイル部分(L1,_ファイル部分), append(CWDIRL,[/|_ファイル部分],L11). ファイル部分(_実質パス部分,_ファイル部分) :- append(_,[/|_ファイル部分],_実質パス部分), \+(member(/,_ファイル部分)),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% search_part_list(L,SL0,SL2,L0,L1,L2) :- append(SL0,[R0],SL0_1), append(SL2,[R2],SL2_1), partition_list_1(L,SL0_1,L0,R1), partition_list_1(R1,SL2_1,L1,L2). partition_list(L1,_指定ならび,L,R) :- append(_指定ならび,[R1],_指定ならび_1), partition_list_1(L1,_指定ならび_1,LX,R). partition_list_1([],_,[],[]) :- !. partition_list_1(L1,L1,[],R) :- !. partition_list_1([A|R1],L1,[A|R2],R) :- partition_list_1(R1,L1,R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/153 # # if select * from t where id=1 # then update t set foo=bar where id=1 # # これをSQLで表現したいのですが可能でしょうか? # # 'if select * from t where id=1 then update t set foo=bar where id=1' :- '1要素のupdate'(t,id1,'1',foo,bar). '1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :- 組構造を得る(_テーブル名,_属性名ならび), 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P), 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項), retract(_現在の項), '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組), asserta(_置換する項). 組構造を得る(_テーブル名,_属性名ならび) :- findall([_属性番号,_属性名],( テーブル構造(_テーブル名,_属性番号,_属性名)), L1), sort(L1,L2), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび). 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :- 置換する組(_属性名ならび,_置換する組), 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組), _置換項 =.. [_テーブル名|_置換する組]. 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :- 現在の組(_属性名ならび,_現在の組), 鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組), _現在の項 =.. [_テーブル名|_現在の組]. 現在の組(_属性名ならび,_現在の組) :- length(_属性名ならび,Len), length(_現在の組,Len). 置換する組(_属性名ならび,_置換する組) :- length(_属性名ならび,Len), length(_置換する組,Len). 鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :- nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_現在の組,_鍵値),!. 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :- nth1(_置換属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_置換する組,_鍵値),!. '置換する組の変数部分だけ元の値に単一化する'([],[]). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :- '置換する組の変数部分だけ元の値に単一化する'(R1,R2). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :- \+(A = B), '置換する組の変数部分だけ元の値に単一化する'(R1,R2). % 以下のサイトは # # 非決定性の置換述語の雛形を作れ。 # 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), concat_atom(_置換された部分までの文字列,_置換された文字列_2],_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,0,_前文字列), sub_atom(_文字列,S+Len,R,0,_後文字列), concat_atom([_前文字列,_置換文字列,_置換された部分までの文字列]), concat_atom([_置換された部分までの文字列,_後文字列],_置換された文字列),!. % 以下のサイトは # # 非決定性の置換述語を使って、全てを置換した文字列だけを取り出せ。 # 全てを置換した文字列だけを取り出す(_文字列,_置換対象文字列,_置換文字列,_全てを置換した文字列) :- findall(_置換された文字列,( 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列)), _置換された文字列ならび), append(_,[_全てを置換した文字列],_置換された文字列ならび),!. 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), concat_atom(_置換された部分までの文字列,_置換された文字列_2],_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,0,_前文字列), sub_atom(_文字列,S+Len,R,0,_後文字列), concat_atom([_前文字列,_置換文字列,_置換された部分までの文字列]), concat_atom([_置換された部分までの文字列,_後文字列],_置換された文字列),!. % 以下のサイトは # # C:\Users\workspace\pythonというディレクトリの中のpythonファイルを実行すると、 # pythonがあるディレクトリと同ディレクトリの全てのテキスト形式ファイル内にある # path1、path2に格納されている文字列のディレクトリを # C:\Users\workspace\pythonに置き換えたいです。 # 現ディレクトリ('C:\\Users\\workspace\\python\\'). 'ディレクトリ内の全テキストファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する' :- ディレクトリ内の全テキストファイル(_テキストファイル名ならび), 'ファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび). ディレクトリ内の全テキストファイル(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). 'ファイル内のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび) :- append(_,[_テキストファイル名|R],_テキストファイル名ならび), 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名), R = []. 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名) :- get_lines(_テキストファイル名,Lines), 'path1, path2 のディレクトリを現ディレクトリに置換する'(Lines,Lines2), put_lines(_テキストファイル名,Lines2). 'path1, path2 のディレクトリを現ディレクトリに置換する'([],[]) :- !. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line1|R1],[Line2|R2]) :- 'path1かpath2が存在する'(Line1,_path,_パス,R), パスを現ディレクトリに変換(_path,_パス,R,,Line2), 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2),!. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line|R1],[Line|R2]) :- 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2). 'path1かpath2が存在する'(Line1,_path,_パス,R) :- split(Line1,[' '],[_path,=,_パス|R]), member(_path,[path1,path2]),!. パスを現ディレクトリに変換(_path,_パス,R,Line2) :- 現ディレクトリ(DIR), split(_パス,['\\'],L), append(_,[_ファイル名],L), concat_atom([DIR,_ファイル名],_更新されたパス), concat_atom([_path,=,_更新されたパス,R],' ',Line2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/727 # # わかりにくい質問かもしれませんがよろしくお願いします。 # # ●正規表現の使用環境 # Java(Android) # # ●検索か置換か? # 検索 # # ●説明 # 文字列から、数値を含むURLを検索し、その数値を取得したい # # ●対象データ # http://ime.nu/some_website.net/category:63 # http://ime.nu/some_website.net/category:19 # ・・・ # のように、数値を含むURLを含んだ文字列 # # ●希望する結果 # http://ime.nu/some_website.net/category:63 # だったら、63を取得 # # '文字列から、数値を含むURLを検索し、その数値を取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- '数値を含むURLを検索し'(_文字列,_前文字列_1,_数値を含むURL,_後文字列_1), 数値を取得したい(_数値を含むURL,_前文字列_2,_適合文字列,_後文字列_2), concat_atom([_前文字列_1,_前文字列_2],_前文字列), concat_atom([_後文字列_2,_後文字列_1],_後文字列). '数値を含むURLを検索し'(_文字列,_前文字列,_数値を含むURL,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,_数値を含むURL_1,_後文字列_1,L1,L2,L3), 'URLである'(L2), 'L3は[]であるか先頭が空白'(L3), '数値を含むURLを検索し'(_前文字列_1,_数値を含むURL_1,_後文字列_1,_前文字列,_数値を含むURL,_後文字列). '数値を含むURLを検索し'(_前文字列,_数値を含むURL,_後文字列,_前文字列,_数値を含むURL,_後文字列). '数値を含むURLを検索し'(_前文字列_1,_数値を含むURL_1,_後文字列_1,_前文字列,_数値を含むURL,_後文字列) :- '数値を含むURLを検索し'(_後文字列_1,_前文字列_2,_数値を含むURL,_後文字列), concat_atom([_前文字列_1,_数値を含むURL_1,_前文字列_2],_前文字列). 'URLである'([h,t,t,p,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([h,t,t,p,s,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([f,t,p,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([f,i,l,e,:,/,/|R]) :- \+(member(' ',R)),!. 'L3は[]であるか先頭が空白'([]) :- !. 'L3は[]であるか先頭が空白'([' '|_]). 数値を取得したい(_数値を含むURL,_前文字列,_適合文字列,_後文字列) :- sub_atom(_数値を含むURL,_,_,_,_前文字列_1,_適合文字列_1,_後文字列_1,L1_1,L2_1,L3_1), 全てが数字(L1), \+((last(L1,A),数字(A))), \+((L3 = [B|_],数字(B))). 数値を取得したい(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 数値を取得したい(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 数値を取得したい(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 数値を取得したい(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), concat_atom([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 全てが数字([]). 全てが数字([A|R]) :- 数字(A), 全てが数字(R). 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']),!. 数字(A) :- member(A,[0,1,2,3,4,5,6,7,8,9]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/216 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):sinカーブを縦に描画するプログラムを作れ。0度から360度までの範囲を描画し、 # 縦軸と横軸も描画すること。 # 'sinカーブを縦に描画するプログラムを作れ。0度から360度までの範囲を描画し、縦軸と横軸も描画すること' :- length(_キャンパス,61), 'キャンパスにsinカーブを描画する'(_キャンパス), キャンパスを表示する(_キャンパス). 'キャンパスを構成しながらsinカーブを描画する'(_キャンパス) :- findall(_キャンパス,( append(L0,[L|_],_キャンパス), length(L,49), キャンパスに描画(L0,L)), _キャンパス). キャンパスに描画(Ln,L) :- 刻みを得る(_刻み), length(Ln,N), _星の位置 is truncate(24 * sin(_刻み * N)) + 25, 星の位置描画(N,_星の位置,L). 刻みを得る(_刻み) :- _刻み is 2 * pi / 60. 星の位置描画(N,_星の位置,L) :- length(L0,_星の位置), append(L0,[*|L0],L), 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- length(L0,_星の位置), append(L1,['|'|L1],L), append(L0,[*|_],L), 変数を全て置換する(N,L,L),!. 変数を全て置換する(_,[],[]) :- !. 変数を全て置換する(N,[V|R1],['-'|R2]) :- var(V), member(N,[0,15,30,45,60]), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て置換する(N,[V|R1],[' '|R2]) :- var(V), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て空白に置換する(N,[A|R1],[A|R2]) :- 変数を全て空白に置換する(N,R1,R2). キャンパスを表示する([]). キャンパス表示する([L|R]) :- 左端の十文字分は空白, 一行表示する(L), キャンパスを表示する(R). 左端の十文字分は空白 :- write(' '). 一行表示する([]) :- !. 一行表示する([A|R]) :- write(A), 一行表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/762 # # ●正規表現の使用環境 # MySQL4.1のREGEXP # ●検索か置換か? # 検索 # ●説明 # カラム内に <> を含むテキストデータがあるのですが # 調べたい数字が入っているかを調べたい # # ●対象データ # 3<>4 # 5<>32<>2 # 5<>3<>6 # 3 # 4 # # この中から3を含むものを検索したい(32はヒットしないように) # # ●希望する結果 # 3<>4 # 5<>3<>6 # 3 # # 'カラム内に <> を含むテキストデータがあるのですが調べたい数字が入っているかを調べたい'(_カラムならび,_調べたい数字,_適合カラム) :- append(_,[_カラム|_],_カラムならび), 調べたい数字が入っているか(_カラム). 調べたい数字が入っているか(_,_調べたい数字) :- !. 調べたい数字が入っているか(_カラム,_調べたい数字) :- split(_カラム,['<>'],L), append(_,[_調べたい数字|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/260 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # sinのグラフを次のように描くプログラムを作成せよ # ただしsin90°とsin270°に対するアスタリスクの数は20個とする。 # http://ime.nu/beebee2see.appspot.com/i/azuYk7KSBQw.jpg # 'sinのグラフを次のように描くただしsin90°とsin270°に対するアスタリスクの数は20個とする' :- length(_キャンパス,25), 'キャンパスにsinカーブを描画する'(_キャンパス), キャンパスを表示する(_キャンパス). 'キャンパスを構成しながらsinカーブを描画する'(_キャンパス) :- findall(_キャンパス,( append(L0,[L|_],_キャンパス), length(L,40), キャンパスに描画(L0,L)), _キャンパス). キャンパスに描画(Ln,L) :- 刻みを得る(_刻み), length(Ln,N), _星の位置 is truncate(20 * sin(_刻み * N)) + 20, 星の位置描画(N,_星の位置,L). 刻みを得る(_刻み) :- _刻み is 2 * pi / 24. 星の位置描画(N,10,L) :- 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- N > 10, for(11,M,N), 星を描画(M,L), M = N, 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- N < 10, for(9,M,N), 星を描画(M,L), M = N, 変数を全て置換する(N,L,L),!. 星を描画(M,L) :- length([_|Ln],M), append(L2,[*|R],L),!. 変数を全て置換する(_,[],[]) :- !. 変数を全て置換する(N,[V|R1],[' '|R2]) :- var(V), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て空白に置換する(N,[A|R1],[A|R2]) :- 変数を全て空白に置換する(N,R1,R2). キャンパスを表示する([]). キャンパス表示する([L|R]) :- 左端の十文字分は空白, 一行表示する(L), キャンパスを表示する(R). 左端の十文字分は空白 :- write(' '). 一行表示する([]) :- !. 一行表示する([A|R]) :- write(A), 一行表示する(R). % % C153_216.html の類型 % % 述語 星の位置描画/3 のあたりが微妙に違う。 % X軸、Y軸を描かなくてよいことからも差異を生じる。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 住所録に新規データの追加(_名前,_住所,_電話番号,_学籍番号) :- 住所録(名前,_名前ならび), 名前が空の位置を捜す(_名前ならび,_n番目), 各項目を置換してから登録(_n番目,_名前,_住所,_電話番号,_学籍番号),!. 名前が空の位置を捜す(_名前ならび,_n番目) :- append(L0,[''|R],_名前ならび), length([_|L0],_n番目). 各項目を置換してから登録(_n番目) :- 名前を置換してから登録(_n番目,_名前), 住所を置換してから登録(_n番目,_住所), 電話番号を置換してから登録(_n番目,_電話番号), 学籍番号を置換してから登録(_n番目,_学籍番号). 名前を置換してから登録(_n番目,_名前) :- retract(住所録(名前,_名前ならび)), length([_|L0],_n番目), append(L0,[_|R],_名前ならび), append(L0,[_名前|R],_置換された名前ならび), assertz(住所録(名前,_置換された名前ならび)). 住所を置換してから登録(_n番目,_住所) :- retract(住所録(住所,_住所ならび)), length([_|L0],_n番目), append(L0,[_|R],_住所ならび), append(L0,[_住所|R],_置換された住所ならび), assertz(住所録(住所,_置換された住所ならび)). 電話番号を置換してから登録(_n番目,_電話番号) :- retract(住所録(電話番号,_電話番号ならび)), length([_|L0],_n番目), append(L0,[_|R],_電話番号ならび), append(L0,[_電話番号|R],_置換された電話番号ならび), assertz(住所録(電話番号,_置換された電話番号ならび)). 学籍番号を置換してから登録(_n番目,_学籍番号) :- retract(住所録(学籍番号,_学籍番号ならび)), length([_|L0],_n番目), append(L0,[_|R],_学籍番号ならび), append(L0,[_学籍番号|R],_置換された学籍番号ならび), assertz(住所録(学籍番号,_置換された学籍番号ならび)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/799 # # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # 文字列の中に同じ文字が2つ以上含まれる行を削除したい # # ●対象データ # aaaaaaaa # abcabcab # abcdefgh # agbchddf # cbfdaehg # dbcahebg # dffbdeha # echfbgad # fbadcaeh # habcdefg # # ●希望する結果 # abcdefgh # cbfdaehg # echfbgad # habcdefg # # # # 見づらいかと思いますが # どうかよろしくお願いします。 # # 文字列の中に同じ文字が2つ以上含まれる行を削除したい([],[]). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([_|R1],R2) :- 同じ文字が2つ以上含まれる行は削除する(_行), 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([A|R1],[A|R2]) :- 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 同じ文字が2つ以上含まれる行は削除する(_行) :- atom_chars(_行,_文字ならび), 整列(_文字ならび,_整列された文字ならび), 整列した要素に重複がある(_整列された文字ならび). 整列した要素に重複がある([A,A|_]) :- !. 整列した要素に重複がある([_|R]) :- 整列した要素に重複がある(R). % 以下のサイトは ?- 'a##'. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/480 # # [1] 授業単元:プログラミング技法、配列とポインタ # [2] 問題文(含コード&リンク):整数型配列a[10]とb[10]を宣言し、a[10]に任意で数値を10個入力する。 # b[10]は初期値として0を代入しておく。 # 任意で入力された10個の整数のうち、奇数のみ抜き出してb[0]から順番に代入する。 # 最後に配列bの中身を出力し終了する。このとき0は表示されないようにすること。 # '整数型配列a[10]とb[10]を宣言し、a[10]に任意で数値を10個入力する。b[10]は初期値として0を代入しておく。任意で入力された10個の整数のうち、奇数のみ抜き出してb[0]から順番に代入する。最後に配列bの中身を出力し終了する。このとき0は表示されないようにすること。' :- '10要素のならびを確保し全て0を入れる'(_10要素のならび), '任意で入力された10の整数のうち奇数のみ抜き出してならびを置換する'(1,_10要素のならび,_置換され了った10要素のならび), 'ならびの中身のうち0でない要素を出力する'(_置換され了った10要素のならび). '10要素のならびを確保し全て0を入れる'(_10要素のならび) :- length(_10要素のならび,10), all(_10要素のならび,0). '任意で入力された10の整数のうち奇数のみ抜き出してならびを置換する'(_n,_ならび,_ならび) :- _n > 10,!. '任意で入力された10の整数のうち奇数のみ抜き出してならびを置換する'(_n,_10要素のならび_1,_置換された10要素のならび) :- '任意の入力された整数'(_整数), '奇数のみ抜き出してならびを置換する'(_n,_整数,_10要素のならび_1,_置換された10要素のならび_2), _n_2 is _n + 1, '任意で入力された10の整数のうち奇数のみ抜き出してならびを置換する'(_n_2,_10要素のならび_2,_置換された10要素のならび). '任意の入力された整数'(_整数) :- _整数 is random(1000) + 1. '奇数のみ抜き出してならびを置換する'(_n,_整数,_10要素のならび_1,_置換された10要素のならび_2) :- 奇数(_整数), length([_|L0],_n), append(L0,[A|R],_10要素のならび_1), append(L0,[_整数|R],_10要素のならび_2),!. '奇数のみ抜き出してならびを置換する'(_,_,_10要素のならび,_置換された10要素のならび). 奇数(N) :- 1 is N mod 2. 'ならびの中身のうち0でない要素を出力する'(_置換され了った10要素のならび) :- append(L0,[_要素|R],_置換され了った10要素のならび), '0でない要素を出力する'(L0,_要素), R = []. '0でない要素を出力する'(L0,_要素) :- \+(_要素 = 0), length([_|Ln],_何番目), writef('%t: %t\n',[_何番目,_要素]),!. '0でない要素を出力する'(_,_). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/17 # # 前スレの未解決問題。(ほかにあったら転記してね) # 979 :デフォルトの名無しさん:2011/11/29(火) 21:17:42.06 # [1] 授業単元:コマンドライン引数 # [2] 問題文(含コード&リンク): # コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. # 1. 2 〜5項式までの四則演算(計算順もちゃんと考慮すること) # (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 # 答えは 12 # # C :¥Programming>dentaku 2 * 3 + 1 # 答えは 7 # # 2.()を用いた演算(かっこの中の計算を最優先する) # (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) # 答えは 70 # # 3. (sin, cos, tan)の演算 # (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 # 答えは 1 # # 4.logの演算 # (出力例)C :¥Programming>dentaku log(3) * 2 + 1 # 答えは 1.9542425094 # # 5. 半角スペースを入れ忘れても演算可能 # (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 # 答えは 9 # 電卓 :- 式の入力(Line), 項に分解(Line,_項ならび), '2. () を用いた演算'(_項ならび,X), writef('%12r\n',[X]). 式の入力(Line) :- writef('%12r\n',[0]), get_line(Line),!. 項に分解(Line,_項ならび) :- atom_chars(Line,Chars), 一旦空白要素を削除する(Chars,Chars1), '先頭の符号に注意して、演算子の前後に空白を入れる'(Chars1,Chars2), atom_chars(Line2,Chars2), split(Line2,[' '],_項ならび). 一旦空白要素を削除する([],[]). 一旦空白要素を削除する([' '|R1],R2) :- 一旦空白要素を削除する(R1,R2),!. 一旦空白要素を削除する([A|R1],[A|R2]) :- 一旦空白要素を削除する(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(['-'|R1],['-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '先頭の符号に注意して、演算子の前後に空白を入れる'(L1,L2) :- 演算子の前後に空白を入れる(L1,L2),!. 演算子の前後に空白を入れる([],[]),!. 演算子の前後に空白を入れる(['(','-'|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(['-'|R1],R2),!. 演算子の前後に空白を入れる([')','-'|R1],[' ',')',' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+','-'|R1],[' ','+',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-','-'|R1],[' ','-',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*','-'|R1],[' ','*',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/','-'|R1],[' ','/',' ','-'|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['('|R1],[' ','(',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([')'|R1],[' ',')',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['+'|R1],[' ','+',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['-'|R1],[' ','-',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['*'|R1],[' ','*',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる(['/'|R1],[' ','/',' '|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. 演算子の前後に空白を入れる([A|R1],[A|R2]) :- 演算子の前後に空白を入れる(R1,R2),!. '2. () を用いた演算'(_項ならび,X) :- '先に()グループを演算する'(_項ならび,_項ならびの一), '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X). '先に()グループを演算する'([],[]). '先に()グループを演算する'(['('|R1],[X|R2]) :- '()グループを演算して置換'(R1,X), '先に()グループを演算する'(R1,R2),!. '先に()グループを演算する'([A|R1],[A|R2]) :- '先に()グループを演算する'(R1,R2),!. '()グループを演算して置換'([],LX,X,[]) :- '+,-でグループ化する'(_項ならびの一,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'([')'|R],LX,X,R) :- '+,-でグループ化する'(LX,_項ならびの二), '要素の四則演算'(_項ならびの二,X),!. '()グループを演算して置換'(['('|R],LX,X,R) :- '()グループを演算して置換'(['('|R],[],Y,R1), append(LX,[Y],LY), '()グループを演算して置換'(R1,LY,X,R),!. '()グループを演算して置換'([A|R1],LX,X,R) :- append(LX,[A],LY), '()グループを演算して置換'(R1,LY,X,R). '+,-でグループ化する'(L,[L0,A|R2]) :- append(L0,[A|R],L), '+か-'(A), '+,-でグループ化する'(R,R2),!. '+,-でグループ化する'(L,[L]). '+か-'(+). '+か-'(-). '要素の四則演算'([L],X) :- ならび評価(L,X),!. '要素の四則演算'([L1,'+'|R1],X) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A + Y. '要素の四則演算'([L1,'-',L2|R1],[C|R2]) :- ならび評価(L1,A), '要素の四則演算'(R1,Y), X is A - Y. ならび評価([A],A) :- !. ならび評価([A,'*'|R1],X) :- ならび評価(R1,Y), X is A * Y. ならび評価([A,'/'|R1],X) :- ならび評価(R1,Y), X is A // Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/865 # # ../test/read.cgi/tech/1301067486/864 失礼しました # # ●正規表現の使用環境 # psstpsstというリネームソフト(Perl互換) # # ●検索か置換か? # 置換 # # ●説明 # 最大4桁で書かれた数字部分を3桁に統一したい # # ●対象データ # ABCA01.txt # BCAA2.txt # CABA0255.txt # # ●希望する結果 # AAA001.txt # AAA002.txt # AAA255.txt # # どうぞよろしくおねがいします # # 最大4桁で書かれた数字部分を3桁に統一したい(_文字列,_固定部分ファイル名,_置換された文字列) :- sub_atom(Line,_,_,_,S1,S2,S3,L1,L2,L3), ファイル部分の特定(S1,L2,L2_0,L2_1), 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_0,L2_1,S3,_置換された文字列). ファイル部分の特定(S1,L2,L2_0,L2_1) :- \+((sub_atom(S1,_,1,0,A),ファイルを構成する文字(A))), append(L2_0,L2_1,['.',t,x,t],L2), すべて数字(L2_1), last(L2_0,B), \+(数字(B)). 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_1,S3,_置換された文字列) :- 三桁の数字に変換する(L2_1,_三桁の数字列), concat_atom([S1,_固定部分ファイル名,_三桁の数字列,'.txt',S3],_置換された文字列). 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_1,S3,_置換された文字列) :- 最大4桁で書かれた数字部分を3桁に統一したい(S3,_固定部分ファイル名,_置換された文字列_1), concat_atom([S1,_固定部分ファイル名,_三桁の数字列,'.txt',_置換された文字列_1],_置換された文字列). ファイルを構成する文字(A) :- 数字(A),!. ファイルを構成する文字(A) :- A @>= 'A', A @=< 'Z',!. ファイルを構成する文字(A) :- A @>= 'a', A @=< 'z',!. ファイルを構成する文字(A) :- member(A,['-','_','#','$','~','&']),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 全て数字([]). 全て数字([A|R]) :- 数字(A), 全て数字(R). 三桁の数字に変換する(L,_三桁の数字) :- concat_atom(['0','0','0'|L],S1), sub_atom(S1,_,3,0,_三桁の数字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/929 # # AをB、BをC・・・と # アルファベットをひとつずつずらすには、どうやって書いたらいいでしょうか? # サクラエディタでの置換を考えてます # # 'AをB、BをC・・・とアルファベットをひとつずつずらす'(_文字列,_アルファベットをひとつずつずらされた文字列) :- findall(_ずらした文字,( sub_atom(_文字列,_,1,_,_文字), アルファベットをひとつずらす(_文字,_ずらした文字)), L), concat_atom(L,_アルファベットをひとつずらされた文字列). アルファベットをひとつずらす(_文字,_ずらした文字) :- append(_,[_文字,_ずらした文字|_],[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]),!. アルファベットをひとつずらす(_文字,_ずらした文字) :- append(_,[_文字,_ずらした文字|_],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y',Z']),!. アルファベットをひとつずらす(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/41 # # ●正規表現の使用環境 # c# # # ●検索か置換か? # 検索 # # ●説明 # 一番長い数字の連続を検索したいです # # ●対象データ # hogehoge120_hoge001218hoge1 # # ●希望する結果 # 001218 # # 一番長い数字の連続を検索したいです(_文字列,_前文字列,_適合文字列,_後文字列) :- '数字文字列の位置・長さの選択'(_文字列,L), 最大長の数字文字列(L,_文字列,_前文字列,_適合文字列,_後文字列). '数字文字列の位置・長さの選択'(_文字列,L) :- findall([P2,P1,P3],( sub_atom(_文字列,P1,P2,P3,S1,S2,S3,L1,L2,L3), 全て数字(L2), \+((last(L1,A),数字(A))), \+((L3=[B|_],数字(B)))), L). 最大長の数字文字列(L,_文字列,_前文字列,_適合文字列,_後文字列) :- max(L,[_最大長,_,_]), member([_最大長,P1,P3],L), 文字列の切り取り(_文字列,P1,_最大長,P3,_前文字列,_適合文字列,_後文字列). 文字列の切り取り(_文字列,P1,P2,P3,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,P1,P2,P3,_適合文字列), sub_atom(_文字列,0,P1,_,_前文字列), sub_atom(_文字列,P1+P2,_,0,_後文字列). 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 全て数字([]). 全て数字([A|R]) :- 数字(A), 全て数字(R). % 以下のサイトは # 出典::正規表現 Part9 #101 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # 文字列の先頭の部分のカッコを消したい # # ●対象データ # (hoge)あいうえお # # ●希望する結果 # hogeあいうえお # # よろしくお願いします # # 文字列の先頭の部分のカッコを消したい(_文字列,_置換した文字列) :- atom_chars(_文字列,_文字ならび), 文字ならびの先頭の部分のカッコを消す(_文字ならび,_置換した文字ならび), atom_chars(_置換した文字列,_置換した文字ならび). 文字ならびの先頭の部分のカッコを消す(_文字ならび,_置換した文字ならび) :- 先頭部分のカッコ内の文字ならびと残り文字ならびを得る(_文字ならび,_カッコ内の文字ならび,_残り文字ならび), カッコ内の文字ならびと残り文字ならびを結合する(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび). 先頭部分のカッコ内の文字ならびと残り文字ならびを得る(_文字ならび,_カッコ内の文字ならび,_残り文字ならび) :- append(['('|_カッコ内の文字ならび],[')'|_残り文字ならび],_文字ならび), カッコ内の文字ならびはカッコを含まない(_カッコ内の文字ならび),!. カッコ内の文字ならびはカッコを含まない(_カッコ内の文字ならび) :- \+(member('(',_カッコ内の文字ならび)), \+(member(')',_カッコ内の文字ならび)). カッコ内の文字ならびと残り文字ならびを結合する(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび) :- append(_カッコ内の文字ならび,_残り文字ならび,_置換した文字ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/103 # # あけましておめでとう # # ●正規表現の使用環境 # perl5 # # ●検索か置換か? # 置換 # # ●説明 # 全角,句読点と半角の間を消したい # 半角と半角は無視 # ●対象データ # みんなの憧れ Justin Drew Bieber が大好き # 私だけの Justin が欲しい # やっぱ Bieber 、Bieber って響きがいいよね # # ●希望する結果 # みんなの憧れJustin Drew Bieberが大好き # 私だけのJustinが欲しい # やっぱBieber、Bieberって響きがいいよね # # # 今までは([ぁ-煕]+)と([0-9A-Za-z]+)を組み合わせて何回もやっていたのですが # 例題の1行目の様な物が煩わしいので一括に処理したいです # お願いします # '全角,句読点と半角の間を消したい。半角と半角は無視'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 半角に挟まれていない空白の連続ならび(L1,L2,L3), '全角,句読点と半角の間を消したい 半角と半角は無視'(_S3,_置換された文字列_2), concat_atom([S1,S2,_置換された文字列_2],_置換された文字列),!. '全角,句読点と半角の間を消したい。半角と半角は無視'(_文字列,_文字列). 半角に挟まれていない空白の連続ならび(L1,L2,L3) :- 全て空白(L2), \+((last(L1,A),半角文字(A),L3=[C|_],半角文字(C))). 全て空白([]). 全て空白([' '|R]) :- 全て空白(R). 半角文字(' ') :- !,fail. 半角文字(_文字) :- char_code(_文字,_文字コード), _文字コード < 256. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/151 # # ●JavaScriptかPHP(なければなんでも) # ●置換 # ●現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込むことできましたっけ? # ●あいうあいうあいう・・・ # ●1あいう2あいう3あいう・・・ # # # 検索パターン(L2,_検索パターン) :- L2 = _検索パターン.\ '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,_検索パターン,_置換された文字列) :- '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,[],_検索パターン,_置換された文字列). '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,Ln,_検索パターン,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 検索パターン(L2,_検索パターン), length([_|Ln],Length), '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(S3,[_|Ln],_検索パターン,_置換された文字列_2), concat_atom([S1,Length,S2,_置換された文字列_2],_置換された文字列). '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,_,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/157 # # ●正規表現の使用環境 # PHP 5.2 で出来ればpreg_replace()で。 # # ●検索か置換か? # 置換 # # ●説明 # "/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したいです。 # fooの文字数は不定です。 # # ●対象データ # /foo/bar/baz/qux/ # /qwert/asd/fghjk/klzxv/ # /qazwsx/edc/rfvt/gbyhnu/ # /4756/78674/45756/34545/4564/546/ # # ●希望する結果 # /home/bar/baz/qux/ # /home/asd/fghjk/klzxv/ # /home/edc/rfvt/gbyhnu/ # /home/78674/45756/34545/4564/546/ # # '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,_,S3,_,L2,_), L2 = [/,f,o,o,/], '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列),!. '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(_文字列,_文字列). '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列) :- concat_atom([S1,'/home/',S3],_置換された文字列). '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列) :- '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S3,_置換されたS3), concat_atom([S1,'/home/',_置換されたS3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/159 # # ●正規表現の使用環境 # テキスト # # ●検索か置換か? # 置換 # # ●説明 # 文章内の指定した数の改行毎に、行を一段開けたい。 # 下記例文なら改行三つごとに行を一段開けたい。 # # ●対象データ # (例文) # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # # ●希望する結果 # 人は誰しも初体験にはほろ苦く、甘酸っぱい思い出があるものだが、人生の諸先輩方はどんな童貞喪失体験をしたのか? # 「シリーズ初体験」−−現在70歳の会社役員(兵庫県)が当時の思い出を語った。 # 中学2年の時、国語の女教師に「勉強を教えてあげるから家においで」といわれ、夏休みに入ってすぐに先生の家を訪れました。 # # 教師になって3年目、美人ではないけれど、私にとっては優しいお姉さんのような存在でした。 # 何人かいるのかなと思ったんですが、先生の家に行くと私の他は誰もいませんでした。 # 勉強を教わり、夕食をご馳走になり、その日は泊めてもらいました。 # # 夜中、下半身がもぞもぞするので目が覚めると、先生が私の浴衣の裾を広げていました。 # ------------------------- # よろしくお願いします。 # # '文章内の指定した数の改行毎に、行を一段開ける'(_ファイル,_n行毎) :- get_lines(_ファイル,Lines), 'n行毎に改行を挿入する'(Lines,Lines2), 表示する(_ファイル,Lines2). 'n行毎に改行を挿入する'([A,B,C|R1],[A,B,C,'\n'|R2]) :- 'n行毎に改行を挿入する'(R1,R2),!. 'n行毎に改行を挿入する'(L,L). 表示する(_ファイル,Lines) :- put_lines(_ファイル,Lines). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/197 # # ●正規表現の使用環境 # 秀丸エディタ # ●検索か置換か? # 置換 # ●説明 # <div class="main">の場合に限り、両端のdivをspanに置換したい。 # ※<div class="main">から</div>までの行数は、3行だったり5行だったりと色々変わります。 # ●対象データ # <div class="main">あああああ<br> # いいいいい<br> # ううううう<br> # えええええ<br> # おおおおお<br> # </div> # # ●希望する結果 # <span class="main">あああああ<br> # いいいいい<br> # ううううう<br> # えええええ<br> # おおおおお<br> # </span> # # # 下の正規表現を作ってみたのですが検索でマッチしません。 # どなたか助言頂けるとうれしいです。 # よろしくお願いいたします。 # # 置換元 # <div class="main">(.*\n*)</div> # 置換先 # <span class="main">\1</span> # 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_置換された文字列) :- mainからspanへの置換(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列), 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換数'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列) :- concat_atom([_前文字列,_置換されたdiv部,_後文字列],_置換された文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換数'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列) :- 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_後文字列,_置換された後文字列), concat_atom([_前文字列,_置換されたdiv部,_置換された後文字列],_置換された文字列). mainからspanへの置換(_文字列,_前文字列,_置換された文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[<,d,i,v,' ',c,l,a,s,s,=,'"',m,a,i,n,'"',>|R2],L3), append(L2_2,[<,/,d,i,v,>],R2), append([<,s,p,a,n,' ',c,l,a,s,s,=,'"',m,a,i,n,'"',>|L2_2],[<,/,s,p,a,n,>],L2_3), concat_atom(L2_3,_置換された文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/239 # # 質問させてください。 # 半角文字列にスペースが含まれています。 # # 例 # 727 751 798 625 791 460 645 850 656 697....... # このスペースをカウントして,3つめのスペースだけを改行に置換する場合(下) # 727 751 798 # 625 791 460 # 645 850 656 # 697....... # # どう表現すればいいのでしょうか? # # 数値が全て3桁ならば分かるのですが,2桁や4桁が含まれており文字数ではマッチできません。 # よろしくお願いします # 'スペースをカウントして,3つめのスペースだけを改行に置換する'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars1), 'スペースをカウントして,3つめのスペースだけを改行に置換する'(0,Char,Char1), concat_atom(_置換された文字列,Char2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(_,[],[]) :- !. 'スペースをカウントして,3つめのスペースだけを改行に置換する'(2,[' '|R1],['\n'|R2]) :- 'スペースをカウントして,3つめのスペースだけを改行に置換する'(0,R1,R2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,[' '|R1],[' '|R2]) :- N2 is N + 1, 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N2,R1,R2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,[A|R1],[A|R2]) :- \+(A=' '), 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,R1,R2). % 以下のサイトは # # 最大公約数をユークリッドの互除法で求める。 # 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :- 'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数),!. 最大公約数をユークリッドの互除法で求める(M,N,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(M,N,_最大公約数). 'MがNより小さい時はNとMを置換して実行する'(M,N,_最大公約数) :- M < N, 最大公約数をユークリッドの互除法で求める(N,M,_最大公約数). ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_被除数,_除数,_最大公約数) :- _剰余 is _被除数 mod _除数, 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,_剰余,_最大公約数). 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,0,_最大公約数) :- 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数),!. 割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,_剰余,_最大公約数) :- '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除数,_剰余,_最大公約数). 割り切れたらその時の除数が最大公約数だ(_除数,_最大公約数) :- _除数 = _最大公約数. '割り切れなかったら除数を被除数、剰余を除数に置き換えて計算を続ける'(_除数,_剰余,_最大公約数) :- ユークリッドの互除法は割り切れるまで除数だった数を被除数に剰余だった数を除数として割ることを繰り返す(_除数,_剰余,_最大公約数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/368 # # お願いします # # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # 0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\「」,.()-/ # # preg_replace関数を使い上記文字以外を全て削除したい # # ●対象データ # 0ガ9ギAグアaイbウcエdオ # # ●希望する結果 # 09Aアイウエオ # '0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/ preg_replace関数を使い上記文字以外を全て削除したい'(_文字列,_置換された文字列) :- atom_chars('0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/',_削除しない文字ならび), findall(_文字,( sub_atom(_文字列,_,1,_,_文字), member(_文字,_削除しない文字ならび)), _選択された文字ならび), concat_atom(_選択された文字ならび,_置換された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/461 # # ●正規表現の使用環境 # linux 2.6系 grep / Scientific Linux 6.1 # # ●検索か置換か? # 検索 # # ●説明 # IPアドレス(xxx.xxx.xxx.xxx IPv4)にヒットさせたい # # ●対象データ # 192.168.0.1 # 255.255.255.0 # 999.999.999.999(注:IPアドレスとして許容されていない) # # ●試した正規表現 # "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" # # 今回の検索では目視で判別できましたが、 # 999.999.999.999←これにヒットしてしまう等、致命的な部分があります。 # # ご教示いただければ幸いです。 # # # 'IPアドレス(xxx.xxx.xxx.xxx IPv4)にヒットさせたい'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), 数字とピリオドのみ(L2), \+((last(L1,A),数字(A))), \+((L3=[B|_],数字(B))), split(_適合文字列,['.'],[N1,N2,N3]), 'IPアドレス範囲'([N1,N2,N3]). 数字とピリオドのみ([]). 数字とピリオドのみ([A|R]) :- member(A,['.','0','1','2','3','4','5','6','7','8','9']), 数字とピリオドのみ(R). 'IPアドレス範囲'([]). 'IPアドレス範囲'([N|R]) :- N >= 0, N =< 255, 'IPアドレス範囲'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/458 # # ●正規表現の使用環境 # wxWidets (wxRegEx) # # ●検索か置換か? # 検索 # # ●説明 # 一行の中に丸括弧で閉じられた文字列を検索したい。 # 丸括弧が出てくる位置や数は不定です # # ●対象データ # (2012年2月)北海道で撮影。(raw)で保存。猫と一緒(雄) # # ●希望する結果 # (2012年2月) (raw) (雄) # # (\\(.*?\\))で検索すると、"(2012年2月)"だけ検索されます。 # (\\(.*?\\))(?:.*)(\\(.*?\\))(?:.*)(\\(.*?\\))で検索すると(2012年2月)(raw)(雄)が検索されます。 # ただ括弧の位置が変わった場合には、この正規表現では検索にかからなくなります。 # # サクラテキストエディタ等の正規表現で検索すると、(\\(.*?\\)) 文章内にいくつ括弧文字列があっても # すべて検索されています。 # # 正規表現でどのように書けばいいのか、それとも、プログラム上で検索しているのかわかりません。 # どのように実現しているかまったくわかりません。 # # 考え方などをおしえてくださいませ。 # # '一行の中に丸括弧で閉じられた文字列を検索したい。丸括弧が出てくる位置や数は不定です'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 丸括弧に挟まれた文字列(L2,_適合文字列), concat_atom([S1,'('],_前文字列), concat_atom([')',S3],_後文字列). 丸括弧に挟まれた文字列(L2,_適合文字列) :- append(['('],L2_1,[')'],L2), \+(member('(',L2_1)), \+(member(')',L2_1)), atom_chars(_適合文字列,L2_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/563 # # ●正規表現の使用環境 # PHP5.3 # # ●検索か置換か? # 置換 # # ●説明 # ページ内にある<h2>〜<h6>に対して内側に<span>を入れたいです。 # hタグににclassがある場合なども想定されますがそれは引き継ぎたいです。 # 何卒ご教授お願いいたします。 # # ●対象データ # <h2>あああああ</h2> # <h2 class="hoge">あああああ</h2> # <h2><span>あああああ</span></h2> # 以下h6まで同様 # <h6>あああああ</h6> # <h6 class="hoge">あああああ</h6> # <h6><span>あああああ</span></h6> # # ●希望する結果 # <h2><span>あああああ</span></h2> # <h2 class="hoge"><span>あああああ</span></h2> # <h2><span>あああああ</span></h2> # 以下h6まで同様 # <h6><span>あああああ</span></h6> # <h6 class="hoge"><span>あああああ</span></h6> # <h6><span>あああああ</span></h6> # # 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_文字列,_置換された文字列) :- 'Hタグを見つけて、情報を分離する'(_文字列,_前文字列,_前タグ,_中間情報,_後タグ,_後文字列), 'spanタグを付加'(_中間情報,_spanタグに挟まれた中間情報), 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_後文字列,_置換された文字列_2), concat_atom([_前文字列,_前タグ,_spanタグに挟まれた中間情報,_後タグ,_置換された文字列_2],_置換された文字列),!. 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_文字列,_文字列). 'Hタグを見つけて、情報を分離する'(_文字列,_前文字列,_前タグ,_中間情報,_後タグ,_後文字列) :- 前タグ(_文字列,_前文字列,_前タグ,A,_残り文字列), '中間情報・後タグ・後文字列'(_残り文字列,A,_中間情報,_後タグ,_後文字列),!. 前タグ(_文字列,_前文字列,_前タグ,A,_残り文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_前タグ,_残り文字列,L1,['<',h,A|R1],L3), 選択できる数字(A), append(L1_1,['>'],R1), \+(member('>',L1_1)),!. '中間情報・後タグ・後文字列'(_文字列,A,_中間情報,_後タグ,_後文字列) :- concat_atom(['<','/',h,A,'>'],_後タグ), sub_atom(_文字列,St,_,_,_中間情報,_後タグ,_後文字列,L1,L2,L3),!. 選択できる数字(A) :- member(A,['2','3','4','5','6']). 'spanタグの付加'(_中間情報,_spanタグに挟まれた中間情報) :- concat_atom(['',_中間情報,''],_spanタグに挟まれた中間情報). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # # Prologに於ける文字置換のパターンを示す # # 文字列を検索して、適合パターンを置換していく行全体を置換したら終了 # 文字列置換(_文字列,_置換された文字列) :- 置換文字列定義を差分リストに変換する, atom_chars(_文字列,Chars), ならび置換(Chars,_置換されたChars), atom_chars(_置換された文字列,_置換されたChars). ならび置換([],[]). ならび置換(L1,L2) :- 置換ならび定義(L1,R1,L2,R2), ならび置換(R1,R2),!. ならび置換([A|R1],[A|R2]) :- ならび置換(R1,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). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # # 文字列を検索して、適合パターンを置換していく # 1) 文字列の先頭から検索パターンに適合する文字列の前の文字列 # 2) 検索パターンに適合した文字列 # 3) 検索パターンに適合した文字列より後の文字列 # # 2) 検索パターンに適合した文字列を置換文字列に置き換える # 置換文字列定義(def,'DEF'). '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- findall([_置換された回数,_置換された文字列],( '置換パターン'(_文字列,_置換された回数,_置換された文字列)), LL), findmax(N,( member([N,_],LL)), Max), member([Max,_置換された文字列],LL). '置換パターン'(_文字列,_置換された文字列) :- '置換回数付き置換パターン'(_文字列,0,_,_置換された文字列). '置換回数付き置換パターン'(_文字列,_置換された回数_1,_置換された回数,_置換された文字列) :- sub_atom(_文字列,_先頭位置,_長さ,_,_適合文字列_1), 置換文字列定義(_適合文字列_1,_置換する文字列), sub_atom(_文字列,0,_先頭位置,_,_前文字列_1), sub_atom(_文字列,_先頭位置+_長さ,_,0,_後文字列_1), _置換された回数_2 is _置換された回数_1 + 1, '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_2,_置換された回数,_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数,_置換された回数,_置換された文字列) :- concat_atom([_前文字列_1,_置換する文字列,_後文字列_1],_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列_2), concat_atom([_前文字列_1,_置換する文字列,_置換された文字列_2],_置換された文字列). % 以下のサイトは # # 極めて単純な filter/2 プログラムを4種示す。 # %%%%% 再帰の節で変換(最も一般的) %%%%%%% filter([],[]). filter([c,d|R1],[x|R2]) :- filter(R1,R2). filter([c|R1],[y,y|R2]) :- filter(R1,R2). filter([d,e|R1],[z|R2]) :- filter(R1,R2). filter([A|R1],[A|R2]) :- filter(R1,R2). % 置換候補が多くなると可読性が極端に落ちる。 %%%% 差分リストを用いた置換述語 %%%%%% filter([],[]). filter(L1,L2) :- 置換(L1,L2,R1,R2), filter(R1,R2). filter([A|R1],[A|R2]) :- filter(R1,R2). 置換([c,d|R1],[x|R2],R1,R2). 置換([c|R1],[y,y|R2],R1,R2). 置換([d,e|R1],[z|R2],R1,R2). % 置換述語の追加変更がやりやすい。 %%%%%%%% 専らappend/3 で処理 %%%%%%% filter([],[]). filter(L1,L2) :- 置換(EL1,EL2), append(EL1,R1,L1), append(EL2,R2,L2), filter(R1,R2). filter([A|R1],[A|R2]) :- filter(R1,R2). 置換([c,d],[x]). 置換([c],[y,y]). 置換([d,e],[z]). %%%%%% append/4 を用いた例 %%%%%%%% filter(L1,L2) :- 置換(B,D), append(A,B,C,L1), append(A,D,L3,L2), filter(C,L3). filter(L,L). 置換([c,d],[x]). 置換([c],[y,y]). 置換([d,e],[z]). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % % append/4はPrologで一番重宝な述語だが % 組込述語という訳にはいかない。 % Prolog処理系起動直後に定義しておこう。 % % 以下のサイトは % % 少なくとも一度は置換する。 % %%%% 差分リストを用いた置換述語 %%%%%% filter(L1,L2) :- 置換(L1,L2,R1,R2), filter_1(R1,R2). filter([A|R1],[A|R2]) :- filter(R1,R2). filter_1([],[]). filter_1(L1,L2) :- 置換(L1,L2,R1,R2), filter_1(R1,R2). filter_1([A|R1],[A|R2]) :- filter_1(R1,R2). 置換([c,d|R1],[x|R2],R1,R2). 置換([c|R1],[y,y|R2],R1,R2). 置換([d,e|R1],[z|R2],R1,R2). % 以下のサイトは # # 極く簡単な filter/2 の5題目です # filter(L1,L2) :- append(A,D1,C,L1), 置換(D1,D2), filter(A,D2,C,L2). filter(A,D2,C,L2) :- append(A,D2,C,L2). filter(A,D2,C,L2) :- filter(C,L2_2), append(A,D2,L2_2,L2). 置換([c,d],[x]). 置換([c],[y,y]). 置換([d,e],[z]). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは # # 極く簡単な filter/2 の5題目です # filter(L1,L2) :- 置換(D1,D2), 'append/4,!'(A,D1,C,L1), filter(A,D2,C,L2). filter(A,D2,C,L2) :- append(A,D2,C,L2). filter(A,D2,C,L2) :- filter(C,L2_2), append(A,D2,L2_2,L2). 置換([c,d],[x]). 置換([c],[y,y]). 置換([d,e],[z]). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). 'append/4,!'(L1,L2,L3,L4) :- append(L1,L2,L3,L4),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/595 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # りんご=20 以外を削除したい # # ●対象データ # みかん10 りんご20 バナナ30 # いちご40 めろん20 りんご20 # # ●希望する結果 # りんご20 # りんご20 # # よろしくお願いします # # 'りんご=20 以外を削除したい'(_文字列,_部分削除された文字列) :- sPLIT(_文字列,[' ','\n'],L), findall(A,( member(A,L), 置換(A)), L1), 部分削除文字列に変換(L1,_部分削除された文字列). 置換('りんご20'). 置換('\n'). 部分削除文字列に変換(L1,_部分削除された文字列) :- ならびを整形する(L1,L2), concat_atom(L2,_部分削除された文字列). ならびを整形する([],[]). ならびを整形する([A],[A]) :- \+(A = '\n'),!. ならびを整形する(['\n'|R1],R2) :- ならびを整形する(R1,R2),!. ならびを整形する([A,'\n'|R1],[A,'\n'|R2]) :- ならびを整形する(R1,R2),!. ならびを整形する([A,B|R1],[A,' '|R2]) :- ならびを整形する([B|R1],R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/595 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # りんご=20 以外を削除したい # # ●対象データ # みかん10 りんご20 バナナ30 # いちご40 めろん20 りんご20 # # ●希望する結果 # りんご20 # りんご20 # # よろしくお願いします # # 検索文字列(りんご20). 'りんご=20 以外を削除したい'(_文字列,_部分削除された文字列) :- findall(_検索文字列,( 検索文字列(_検索文字列)), _検索文字列ならび), 検索文字列と改行だけを切り出す(_文字列,_検索文字列ならび,L1), ならびを整形する(L1,L2), concat_atom(L2,_部分削除された文字列). 検索文字列と改行だけを切り出す(_文字列,_検索文字列ならび,L) :- sPLIT(_文字列,['\n'|_検索文字列ならび],L1), findall(_検索文字列,( member(_検索文字列,L1), member(_検索文字列,_検索文字列ならび)), L). ならびを整形する([],[]). ならびを整形する([A],[A]) :- \+(A = '\n'),!. ならびを整形する(['\n'|R1],R2) :- ならびを整形する(R1,R2),!. ならびを整形する([A,'\n'|R1],[A,'\n'|R2]) :- ならびを整形する(R1,R2),!. ならびを整形する([A,B|R1],[A,' '|R2]) :- ならびを整形する([B|R1],R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/646 # # 質問です # # phpのpreg_replaceで文字列を入れ替えたいのですが # # <a href="mailto:example@example.com">問い合せ</a> # # のexample@example.comのみを入れ替えるにはどのような正規表現を使えば出来るでしょうか? # # よろしくお願いします # 'example@example.comのみを入れ替える'(_文字列,_入れ替える文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス部分(S2,L2), 'example@example.comのみを入れ替える'(S3,_入れ替える文字列,_置換されたS3), concat_atom([S1,'"mailto:',_入れ替える文字列,'"',_置換されたS3],_置換された文字列),!. 'example@example.comのみを入れ替える'(_文字列,_,_文字列). メールアドレス部分(S2,L2) :- L2 = ['"',m,a,i,l,t,o,:|R2], append(L2_1,['"'],R2), \+(member('"',L2_1)), atom_chars(S2_2,R2), メールアドレスとして可能な文字文字列(S2_2),!. メールアドレスとして可能な文字列(_文字列) :- split(_文字列,['@'],[A,B]), メールに使用できるアルファベット(A), メールに使用できるアルファベット(B). メールに使用できるアルファベット(_文字) :- char_code(_文字,_文字コード), メールに使用できる文字コード(_文字コード),!. メールに使用できるアルファベット(_文字) :- member(_文字,['_','-','~']). メールに使用できる文字コード(_文字コード) :- _文字コード >= 65, _文字コード =< 90,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 97, _文字コード =< 122,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 48, _文字コード =< 57,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- sPLIT(_文字列,['\n'],L), '先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L2), concat_atom(L2,_置換された文字列). '先頭にアスタリスクがついている部分を別記号で囲みたい'([],[]). '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n'],['\n']) :- !. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],L) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(['\n',A|R1],L1,R1_1), '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1_1,R2), append(L1,R2,L),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2). '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',A|R2],R) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2,R),!. '先頭にアスタリスクがついている部分'(L,['\n',']'],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- sPLIT(_文字列,['\n'],L), '先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L2), concat_atom(L2,_置換された文字列). '先頭にアスタリスクがついている部分を別記号で囲みたい'([],[]). '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n'],['\n']) :- !. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['[','\n',A|R2]) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2). '先頭にアスタリスクがついている部分'([],[']','\n']). '先頭にアスタリスクがついている部分'(['\n'],[']','\n']) :- !. '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',A|R2]) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2),!. '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',']','\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L5). append(L5,['\n'],L6), concat_atom(L5,'\n',_置換された文字列_0), concat_atom([_置換された文字列_0,'\n'],_置換された文字列),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_文字列). 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,X) :- append(L1,L2,L3,L), '先頭にアスタリスクがついている部分'(L1,L2,L3), 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L3,L4), append(L1,['[\n'|L2],[']\n'|L4],X),!. 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L). '先頭にアスタリスクがついている部分'(L1,L2,L3) :- \+((last(L1,A),sub_atom(A,0,1,_,'*'))), \+((L3 = [B|_],sub_atom(B,0,1,_,'*'))), '全ての要素の先頭文字が*'(L2). '全ての要素の先頭文字が*'([]). '全ての要素の先頭文字が*'([A|R]) :- sub_atom(A,0,1,_,'*'), '全ての要素の先頭文字が*'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/695 # # Objective-CのNSRegularExpressionで、 # 行頭の半角スペース列を置換しようとして@"^ +"と書いたのですが、文字列の最初しか行頭と認識してくれないらしく、 # 複数行にまたがる文字列の各行頭のスペースが置換できないので、改行文字に続く次のスペースも検出しようとして # @"^ +|\\n +" # と書くと、改行文字も含めて置換してしまうため、マッチ部分をキャプチャする()を使って # @"^( +)|\\n( +)" # としたのですが、 # (2147483647,0)という文字列の外の範囲がマッチされてしまい、置換しようとしてエラーとなってしまいます。 # 文字列途中も含めて、行頭の半角スペース列のみを置換するためにはどのようなパターンを使うのが適切でしょうか? # # '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_改行を含む文字列,_置換文字列,_置換された改行を含む文字列) :- 行頭の半角スペース列のならび(_改行を含む文字列,_前文字列,_行頭の空白ならび,_後文字列), '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_後文字列,_置換文字列,_置換された改行を含む文字列_2), concat_atom([前文字列,'\n',_置換文字列,_置換された改行を含む文字列_2],_置換された改行を含む文字列),!. '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_文字列,_,_文字列). 行頭の半角スペース列のならび(_改行を含む文字列,_前文字列,_行頭の空白ならび,_後文字列) :- sub_atom(_改行を含む文字列,_,_,_,_前文字列,S2,_後文字列,L1,['\n'|R2],L3), \+(R2=[]), all(R2,' '), \+((L3=[A|R3],A=' ')). % sub_atom/10 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1331904826/120 # # コマンドプロンプトにてワイルドカードで複数マッチングしてそれぞれ別のsetを置きたいんですけど # うまく行きません。 # for %%A in ("%folder%~n1*.txt") do ( # set tatoeba1=%%A # set tatoeba2=%%A # ) # こういう形まで考えたんですが結局最後のマッチングにsetされます。 # どのような形が正解なのでしょうか? # # 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(_文字列,_置換対象,[_置換要素|R],_置換された文字列) :- 置換対象に合致したら(_文字列,_置換対象,S1,S3), 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(S3,_置換対象,R,_置換された文字列_2), concat_atom([S1,_置換要素,_置換された文字列_2],_置換された文字列),!. 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(_文字列,_,_,_文字列). 置換対象に合致したら(_文字列,_置換対象,S1,S3) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 置換対象と合致(S2,_置換対象). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/741 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # 括弧内に特定の文字列が有れば対応する括弧を装飾したい # # (例ではCCCを含むものを検索し対応する括弧に*を加える) # # ●対象データ # (AACCCDDAABBB) # (AACAABBDBABC) # CDAA(DB(CC)C)(CDD) # C(AA(ABBD)(BCCC)C) # # ●希望する結果 # (*AACCCDDAABBB*) # (AACAABBDBABC) # CDAA(DB(CC)C)(CDD) # C(AA(ABBD)(*BCCC*)C) # # '括弧内に特定の文字列が有れば対応する括弧を装飾したい'(_文字列,_特定文字列,_置換された文字列) :- sPLIT(_文字列,['(',')',' '],L), findall(_置換された要素,( append(L0,[A|R],L), 要素文字列置換(A,_特定文字列,_置換された要素)), L), atomic_list_concat(L,_置換された文字列). 要素文字列置換(A,_特定文字列,_置換された要素) :- sub_atom(A,_,_,_,_特定文字列), atomic_list_concat(['*',A,'*'],_置換された要素),!. 要素文字列置換(A,_,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # # # 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]) :- !. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A,B|R1],[A,C|R2]) :- タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>'],C), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # % % ここでは、 % 非決定性の処理を考える。先頭から順に置換が進んでいくように。 % 注意するべきことは、普通に非決定性に書くと、既に置換したつもりの % 部分が変数の束縛が解かれて、置換前の状態にもどってしまうこと。 % この型の述語では常にその点に注意する。 % 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L1,L2) :- append(L0,[A,B|R],L1). タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>',B],C), append(L0,[C,B|R1],L2), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R,L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2). append(L0,[C|R1],L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,L2_1), append(L0,[C,B|L2_1],L2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは # # 非決定性述語を目標とする時、その得られる解の内で最後の解だけを取得したい。 # # 適用例としては、 # 文字列置換を出現順に非決定性で置換する。つまり利用者は出現順に1-n個の # 置換を選択することができる。そういう述語が定義済みだとする。 # この述語を使って、全置換を求めるというような場合。 # 非決定性述語の最後の解(_非決定性述語,_解) :- findall(_解,_非決定性述語,_解ならび), last(_解ならび,_解). % ?- 非決定性述語の最後の解(member(X,[a,b,c]),X). % X = c % % 非決定性述語の引数を構成する項の中に_解が含まれる必要がある。 % % 以下のサイトは # # 非決定性述語を目標とする時、その得られる解の内で最後の解だけを取得したい。 # # 適用例としては、 # 文字列置換を出現順に非決定性で置換する。つまり利用者は出現順に1-n個の # 置換を選択することができる。そういう述語が定義済みだとする。 # この述語を使って、全置換を求めるというような場合。 # 非決定性述語の最後の解(_非決定性述語,_項指定,_解) :- findall(_項指定,_非決定性述語,_解ならび), last(_解ならび,_解). % % _非決定性述語の引数を構成する項の中に_項指定が含まれる必要がある。 % % 以下のサイトは # # 非決定性述語を目標とする時、その得られる解の内で最後の解だけを取得したい。 # # 適用例としては、 # 文字列置換を出現順に非決定性で置換する。つまり利用者は出現順に1-n個の # 置換を選択することができる。そういう述語が定義済みだとする。 # この述語を使って、全置換を求めるというような場合。 # 非決定性述語の最後の解(_非決定性述語,_解) :- findall(_解,_非決定性述語,_解ならび), last(_解ならび,_解). % % 非決定性述語の引数を構成する項の中に_解が含まれる必要がある。 % % 順に置換する述語例 % 全ての対象を置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 非決定性述語の最後の解(_置換された文字列,順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列),_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列), 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_残り文字列],_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :- 順に置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :- sub_atom(_文字列,_開始位置0オリジン,_長さ,_残り文字数,_置換対象副文字列), sub_atom(_文字列,0,_開始位置0オリジン,_,_前文字列), _残り文字列の開始位置 is _開始位置0オリジン + _長さ, sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列),!. % 以下のサイトは 文字列を順に置換する(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 文字列を置換対象文字列に対して前方文字列と後方文字列に分解する(_文字列,_置換対象文字列,_前方文字列,_後方文字列), 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列). 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列) :- atomic_list_concat([_前方文字列,_置換文字列,_後方文字列],_置換された文字列). 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列) :- 文字列置換を順に置換する(_後方文字列,_置換対象文字列,_置換文字列,_置換された後方文字列), atomic_list_concat([_前方文字列,_置換文字列,_置換された後方文字列],_置換された文字列). 文字列を置換対象文字列に対して前方文字列と後方文字列に分解する(_文字列,_置換対象文字列,_前方文字列,_後方文字列) :- sub_atom(_文字列,_開始位置0オリジン,_,_残り長さ,_置換対象文字列), sub_atom(_文字列,0,_開始位置0オリジン,_前方文字列), sub_atom(_文字列,_,_残り長さ,0,_後方文字列),!. % 以下のサイトは # # 文字列を置換する。一度置換したものは元に戻ることはなく。 # 文字列を置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列), atomic_list_concat([_文字列,_置換文字列,_残り文字列],_置換された文字列). 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_置換対象副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), _残り文字列の開始位置 is _開始位置 + _長さ, sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列). % % 置換対象副文字列の前後を取得する/4 の最後のカットを外した。 % % 以下のサイトは 順に置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- {_文字列,_,_,_,_前文字列,_置換文字列,_後文字列,_,_,_}, 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 順に置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). {_文字列,_開始位置,_文字列長,_残り文字列長,_前文字列,_目的文字列,_後文字列,_前文字列の文字ならび,_目的文字列の文字ならび,_後文字列の文字ならび} :- sub_atom(_文字列,_開始位置,_文字列長,_残り文字列長,_前文字列,_目的文字列,_後文字列,_前文字列の文字ならび,_目的文字列の文字ならび,_後文字列の文字ならび). % % sub_atom/10 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/758 # # ●正規表現の使用環境 # Firefox 3.6.28の*.uc.js # # ●検索か置換か? # 検索?置換? # # ●説明 # ・以前、別のスレでAのURLをBのように、v=以外のパラメータを消すものを書いてもらいました。 #  A: http://ime.nu/www.youtube.com/watch?v=abcdef123456&feature=related&etc=sexample #  B: http://ime.nu/www.youtube.com/watch?v=abcdef123456 # ・正規表現 #  [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'] # # 今回は別のURLからパラメータを消したいです。 # # ●対象データ # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html?ref=rss # # ●希望する結果 # http://ime.nu/www.forest.impress.co.jp/docs/news/20120418_527251.html # # # ※このようにしてみたのですが、上手くいきませんでした。 # var patterns = [ # //置換したいURLパターンを記述 # [/^(http:\/\/(\w+\.)?youtube\.com\/watch).*[?&](v=[^&#]+).*/, '$1?$3'], # [/^(http:\/\/www\.forest\.impress\.co\.jp\/docs\/news\/)[0-9]_[0-9]\.html\?ref=rss, '$1'] # ]; # # 'URLからパラメータを消したい'(_URL文字列,_パラメータの消されたURL文字列) :- split(_URL文字列,['?'],[_パラメータの消されたURL文字列|_]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/662 # # MySQL5 # # 開始日、終了日を持ったテーブルを日付単位に表示したいです。 # tbl_job は、以下の構造です。 # # id, name, start_date, end_date # --------------------------- # 1, JOB1, 2012-04-01, 2012-04-03 # 2, JOB2, 2012-04-02, 2012-04-04 # # 上記テーブルから以下のように日付単位でJOBを表示するSQLを教えてほしいです。 # # date, id, name # -------------------- # 2012-04-01, 1, JOB1 # 2012-04-02, 1, JOB1 # 2012-04-02, 2, JOB2 # 2012-04-03, 1, JOB1 # 2012-04-03, 2, JOB2 # 2012-04-04, 2, JOB2 # # '開始日、終了日を持ったテーブルを日付単位に表示したい' :- 日付単位tbl_jobの生成(_日付単位tbl_jobならび), findsetof(_日付,( member([_date,_,_],_日付単位tbl_jobならび)), _日付ならび), 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付単位tbl_jobの生成(_日付単位tbl_jobならび) :- findall(_日付,( tbl_job(_id,_name,_start_date,_end_date), 日付の生成(_start_date,_end_date,_日付)), _日付単位tbl_jobならび). 日付の生成(_終了年-_終了月-_終了日,_終了年-_終了月-_終了日,_終了年-_終了月-_終了日) :- !. 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_開始年-_開始月-_開始日). 日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_年-_月-_日) :- 翌日(_開始年,_開始月,_開始日,_翌日年,_翌日月,_翌日日), 日付の生成(_翌日年-_翌日月-_翌日日,_終了年-_終了月-_終了日,_年-_月-_日). 翌日(_年,12,31,_翌年,1,1) :- !. 翌日(_年,_月,30,_年,_翌月,1) :- member(_月,[4,6,9,11]), _翌月 is _月 + 1,!. 翌日(_年,_月,31,_年,_翌月,1) :- _翌月 is _月 + 1,!. 翌日(_年,2,29,_年,3,1) :- !. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)), 翌日(_年,_月,_日,_年,_月,_翌日) :- _翌日 is _日 + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび) :- member(_日付,_日付ならび), member([_日付,_id,_name],_日付単位tbl_jobならび), 日付の形式を整えながら一行表示する(_日付,_id,_name), fail. 日付単位に表示する(_日付ならび,_日付単位tbl_jobならび). 日付の形式を整えながら一行表示する(_年-_月-_日,_id,_name) :- swritef(S,'%2r-%2r-%2r',[_年-_月-_日]), 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列), writef('%t, %t, %t\n',[_空白を0に置換した日付文字列,_id,_name). 空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列) :- findall(_文字_2,( sub_atom(S,_,1,_,_文字), 空白を0に置換(_文字,_文字_2)), _空白を0に置換した日付文字列). 空白を0に置換(' ','0') :- !. 空白を0に置換(A,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/765 # # 以下の解決方法を教えてください。 # ●正規表現の使用環境 # emacs-lisp # ●検索か置換か? # 検索 # ●説明 # 特定の文字列Aにマッチしないが、文字列BorCにはマッチする文字列を検索したい。 # 初期状態でregexpは↓のようになっており # "-\\(ring\\|history\\)\\'" # 文字列末尾に -ring か -history があればマッチしてしまいます。 # この状態を維持しつつ特定の文字列を含む文字列であればマッチさせたくない状況を作りたいです。 # ●対象データ # hogehoge-kill-ring # hugahuga-history # user-hogehoge-kill-ring # user-hugahuga-history # hogehoge-user-kill-ring # hugahuga-user-history # ●希望する結果 # hogehoge-kill-ring # ^ # hugahuga-history # ^ # だけが難しければ最悪↓も含んでしまってOK # hogehoge-user-kill-ring # ^ # hugahuga-user-history # ^ # 以上よろしくお願いします。 # # # '特定の文字列Aにマッチしないが、文字列BorCにはマッチする検索'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), '文字列Aにマッチしない'(_適合文字列), '文字列BorCにはマッチする'(_適合文字列). '文字列Aにマッチしない'(_適合文字列) :- 文字列A(_文字列A), \+(_適合文字列=_文字列A). '文字列BorCにはマッチする'(_文字列B) :- 文字列B(_文字列B). '文字列BorCにはマッチする'(_文字列C) :- 文字列C(_文字列C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/765 # # 以下の解決方法を教えてください。 # ●正規表現の使用環境 # emacs-lisp # ●検索か置換か? # 検索 # ●説明 # 特定の文字列Aにマッチしないが、文字列BorCにはマッチする文字列を検索したい。 # 初期状態でregexpは↓のようになっており # "-\\(ring\\|history\\)\\'" # 文字列末尾に -ring か -history があればマッチしてしまいます。 # この状態を維持しつつ特定の文字列を含む文字列であればマッチさせたくない状況を作りたいです。 # ●対象データ # hogehoge-kill-ring # hugahuga-history # user-hogehoge-kill-ring # user-hugahuga-history # hogehoge-user-kill-ring # hugahuga-user-history # ●希望する結果 # hogehoge-kill-ring # ^ # hugahuga-history # ^ # だけが難しければ最悪↓も含んでしまってOK # hogehoge-user-kill-ring # ^ # hugahuga-user-history # ^ # 以上よろしくお願いします。 # # # '特定の文字列Aにマッチしないが、文字列BorCにはマッチする検索'(_文字列,_文字列A,_文字列B,_文字列C,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), '文字列Aにマッチしない'(_適合文字列,_文字列A), '文字列BorCにはマッチする'(_適合文字列,_文字列B,_文字列C). '文字列Aにマッチしない'(_文字列,_文字列A) :- \+(_文字列=_文字列A). '文字列BorCにはマッチする'(_文字列,_文字列B,_) :- _文字列 = _文字列B,!. '文字列BorCにはマッチする'(_文字列,_,_文字列C) :- _文字列 = _文字列C. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/765 # # 以下の解決方法を教えてください。 # ●正規表現の使用環境 # emacs-lisp # ●検索か置換か? # 検索 # ●説明 # 特定の文字列Aにマッチしないが、文字列BorCにはマッチする文字列を検索したい。 # 初期状態でregexpは↓のようになっており # "-\\(ring\\|history\\)\\'" # 文字列末尾に -ring か -history があればマッチしてしまいます。 # この状態を維持しつつ特定の文字列を含む文字列であればマッチさせたくない状況を作りたいです。 # ●対象データ # hogehoge-kill-ring # hugahuga-history # user-hogehoge-kill-ring # user-hugahuga-history # hogehoge-user-kill-ring # hugahuga-user-history # ●希望する結果 # hogehoge-kill-ring # ^ # hugahuga-history # ^ # だけが難しければ最悪↓も含んでしまってOK # hogehoge-user-kill-ring # ^ # hugahuga-user-history # ^ # 以上よろしくお願いします。 # # # '特定の文字列Aにマッチしないが、文字列BorCにはマッチする検索'(_文字列,_文字列A,_文字列B,_文字列C,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,_,_), '文字列Aにマッチしない'(_適合文字列,_文字列A), '文字列BorCにはマッチする'(_適合文字列,_文字列B,_文字列C). '文字列Aにマッチしない'(_文字列,_文字列A) :- \+(_文字列=_文字列A). '文字列BorCにはマッチする'(_文字列,_文字列B,_) :- _文字列 = _文字列B,!. '文字列BorCにはマッチする'(_文字列,_,_文字列C) :- _文字列 = _文字列C. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,[<,t,a,g,>],L1), L3 = [<,/,t,a,g,>|R3], 'tagまたは/tagを含まない'(L2), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). 'tagまたは/tagを含まない'(L2) :- \+(append(_,[<,t,a,g,>|_],L2)), \+(append(_,[<,/,t,a,g,>|_],L2)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_タグ,_置換された文字列) :- タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,_タグ文字ならび,L1), append(_終了タグ文字ならび,R3,L3), タグまたは終了タグを含まない(L2,_タグ文字ならび,_終了タグ文字ならび), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび) :- atom_chars(_タグ,Chars), append([<],Chars,[>],_タグ文字ならび), append([<,/],Chars,[>],_終了タグ文字ならび),!. タグまたは終了タグを含まない(L,L1,L2) :- \+(append(_,L1,_,L)), \+(append(_,L2,_,L)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは # # 文字列の全置換 # # 文字列置換の一つの方式として、置換可能な候補を # 先頭から順に置換していくというものがある。 # この場合、全置換は最終解ということになる。 # 文字列の全置換(_非決定性の置換述語,_全置換) :- _非決定性の置換述語 =.. L, last(L,_選択項), 非決定性述語の最後の解(_選択項,_非決定性の置換述語,_全置換). 非決定性述語の最後の解(_選択項,_副目標,_非決定性述語の最後の解) :- findall(_選択項,( _副目標), L), last(L,_非決定性述語の最後の解),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/792 # # ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? # # xkdmeABCidkDEFledxaoDEFasdDEF # ↓ # xkdmeABCidkXYZledxaoXYZasdXYZ # # 'ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? '(_文字列,_置換された文字列) :- sub_atom(_文字列,S1,'ABC',S2),!, その後に登場する全てのDEFをXYZへ置換する(S2,S3), atom_list_concat([S1,'ABC',S3],_置換された文字列). 'ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? '(_文字列,_文字列). その後に登場する全てのDEFをXYZへ置換する(_文字列,_置換された文字列) :- 決定性の全置換(_文字列,'DEF','XYZ',_置換された文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 決定性の全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Start,Length,Rest,_置換対象文字列), sub_atom(_文字列,0,Start,_,S1), Start_S3 is Start + Length, sub_atom(_文字列,Start_S3,Rest,0,S3), 決定性の全置換(S3,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([S1,_置換文字列,_置換された文字列_2],_置換された文字列),!. 決定性の全置換(_文字列,_,_,_文字列). % sub_atom/4 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n,_ならび,_追加後のならび). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_ならび,_,_削除後のならび). 先頭に要素を加える(_要素,_ならび,[_要素|_ならび]). 末尾に要素を加える(_要素,_ならび,_末尾に要素を加えたならび) :- append(_ならび,[_要素],_末尾に要素を加えたならび). 先頭の要素を取り除く([_先頭の要素|_先頭の要素を除いたならび],_先頭の要素,_先頭の要素を除いたならび). 末尾の要素を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- append(_末尾の要素を除いたならび,[_末尾の要素],_ならび). n番目の要素を表示(_n,_ならび,_n番目の要素) :- length([_|L0],_n), append(L0,[_n番目の要素|_],_ならび), n番目の要素を取り除く(_n,_ならび,_n番目の要素,_n番目の要素を除いたならび) :- length([_|L0],_n), append(L0,[_n番目の要素|R],_ならび), append(L0,R,_n番目の要素を除いたならび). 要素をn番目に挿入(_要素,_n,_ならび,_要素をn番目に挿入されたならび) :- length([_|L1],_n), append(L1,L2,_ならび), append(L1,[_要素|L2],_要素をn番目に挿入されたならび). n番目の要素の置換(_n,_置換要素,_ならび,_n番目の要素を置換されたならび) :- length([_|L0],_n), append(L0,[_|R],_ならび), append(L0,[_置換要素|R],_n番目の要素を置換されたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/862 # # 以下のように検索と置換をしたいのですが # name0 name1 name2が順番が異なる時どのような正規表現をかけばよいでしょうか # # <en_Image name0="image.png" name1="カツ丼" name2="ご飯"></en_Image> # <en_Image name0="image.png" name2="ご飯" name1="カツ丼"></en_Image> # <en_Image name2="ご飯" name1="カツ丼" name0="image.png"></en_Image> #             ↓ # <en_Image name="カツ丼ご飯image.png"></en_Image> # # name0 name1 name2が順番が異なる時,以下のような正規表現では取り出せますん # pattern="<en_Image.*?name0=\"(\\w+?).*?name1=\"(\\w+?).*?name2=\"(\\w+?)">.*?</en_Image>" # replace="<en_Image name==\"$2$3.$1\"></en_Image>" # # # 'name0 name1 name2が順番が異なる時の検索と置換'(_文字列,_置換文字列) :- sPLIT(_文字列,[''],L), 置換(L,L1), atomic_list_concat(L1,_置換された文字列). 置換([],[]) :- !. 置換([A1,B1,' ',A2,B2,' ',A3,C3|R1],['name="カツ丼ご飯image.png"'|R2]) :- 条件_1([A1,A2,A3]), 条件_2([B1,B2,B3]), 置換(R1,R2),!. 置換([A|R1],[A|R2]) :- 置換(R1,R2). 条件_1([]) :- !. 条件_1([A|R]) :- member(A,['name0=','name1=','name2=']), 条件_1(R). 条件_2([]) :- !. 条件_2([A|R]) :- member(A,['image.png','ご飯','カツ丼']), 条件_2(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/921 # # ●正規表現の使用環境 # 鬼車 # # ●検索か置換か? # 検索 # # ●対象データ # あああかか # うううきき # いいいくく # # ●希望する結果(あああ いいい うううをマッチさせる & きき くく の文字を含まない) # あああ # (あああ の部分のみマッチ) # # ●説明 # 複数の文字(文字列1)をマッチさせたい、そして # その文字列中で、指定した文字が入ってたとき、その文字(文字列1)はマッチしないということは可能でしょうか。 # # [例文] # あああかか # うううきき # いいいくく # # ↓構文はnot使ったりと正規表現と関係無くて申し訳ないですが自分のイメージ的にはこんな感じです。 # ( (あああ|いいい|ううう) (not (きき|くく)) ) # # この場合、「あああかか(正確には あああ の部分のみ)」がマッチとなり、 # 文字列中に「きき、くく」が文字列に含まれる # 「うううきき(正確には ううう の部分)」と「いいいくく(正確には いいい の部分)」はマッチさせない感じです。 # # 調べた感じですと、否定文を使う形になるとは思いますが、否定文が結構複雑そうで、 # それに複数の否定を加えるようだとかなり難しいように感じますが、実際に # このような正規表現を実現出来るか不安なのですが、実現可能でしょうか。 # また、もし上記を満たす正規表現が分かる方おりましたら教えて頂ければ幸いです。 # どうぞよろしくお願い致します。 文字列ならびの検索([_適合文字列|R],_適合文字列) :- \+(sub_atom(_適合文字列,_,2,_,きき)), \+(sub_atom(_適合文字列,_,2,_,くく)), 適合文字列(_適合文字列). 文字列ならびの検索([_文字列|R],_適合文字列) :- 文字列ならびの検索(R,_適合文字列). 適合文字列(_文字列) :- sub_atom(_文字列,0,3,_,あああ),!. 適合文字列(_文字列) :- sub_atom(_文字列,0,3,_,いいい),!. 適合文字列(_文字列) :- sub_atom(_文字列,0,3,_,ううう),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/729 # # DBはSQLiteを想定してますが、MySQLでもpostgreSQLでも全然かまいません # # # 採取リスト # |番号|名称|コード|登録日|登録者|公開| # # というテーブルがあります。 # イメージとして、とある物体がありまして、登録者が各自で次々と登録していきます。 # 各物体には登録者の間で共有されていてぶれのないコード(A-0001とか)があるものの、 # 名称に関しては、ある程度の裁量があるため、登録者によって表記にぶれが起きます。 # # |番号|名称 |コード | 登録日  |登録者|公開| # |01  |クラゲ |A-001|2012/6/1 | 田中 | 1  | # |02  |くらげ |A-001 |2012/6/2 | 鈴木 | 0  | # |03  |海月 |A-001 |2012/6/3 | 佐藤 | 1  | # |04  |クラゲ |A-001|2012/6/4 | 高橋 | 0  | # |05  |ひとで |A-002|2012/6/5 | 小林 | 0  | # # 番号はオートナンバーで主キー。 # 登録日はそのままINSERTされた日。 # 告知フラグは0か1で、外部に公開されていたら1です。 # # んで、ここから公開されてない行を抜き出すビューを作りたいんです。 # CREATE VIEW 未公開リスト (番号, 名称, コード) # AS SELECT 番号, 名称, コード FROM 採取リスト WHERE 公開 = 0 # みたいなSQLを走らせると、 # # |番号|名称  |コード| # |02  |くらげ |A-001| # |04  |クラゲ |A-001| # |05  |ひとで |A-002| # # という風になってしまいますが「くらげ」と「クラゲ」で実質的に重複してしまいます。 # これを例えば「コードを基準にして重複がないように選んだ」上で、 # 名称には、特定の登録者の名称を用いてまとめることはできないのでしょうか? # 単に、DISTINCTを使うだけでは無理なようですが・・・。 # # 未公開リスト(_番号,_名称,_コード) :- '「コードを基準にして重複がないように選んだ」上で、名称には、特定の登録者の名称を用いてまとめる'(_番号,_名称,_コード). '「コードを基準にして重複がないように選んだ」上で、名称には、特定の登録者の名称を用いてまとめる'(_番号,_名称,_コード) :- 名称を登録者で置換したコードならび(_名称を登録者で置換したコードならび), 採取リスト(_番号,_名称_1,_コード,_登録日,_登録者,0), 名称を選択(_コード,_名称_1,_名称を登録者で置換したコードならび,_名称). 名称を登録者で置換したコードならび(_重複するコードならび) :- findsetof(_コード,( 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開)), L1), findsetof([_コード,_名称],( 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開)), L2), 名称を登録者で置換したコードならび(L1,L2,_重複するコードならび),!. 名称を登録者で置換したコードならび(L1,L2,名称を登録者で置換したコードならび) :- findall([_コード,_],( member(_コード,L1), count(member([_コード,_],L2),_度数)), _度数 > 1), _重複するコードならび), 名称を早い者勝ちに登録者名に決定する(_重複するコードならび,名称を登録者で置換したコードならび),!. 名称を早い者勝ちに登録者名に決定する([]). 名称を早い者勝ちに登録者名に決定する([[_コード,_登録者]|R]) :- 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開), 名称を早い者勝ちに登録者名に決定する(R). 名称を選択(_コード,_,_名称を登録者で置換したコードならび,_名称) :- member([_コード,_名称],_名称を登録者で置換したコードならび),!. 名称を選択(_コード,_名称,_,_名称) :- \+(member([_コード,_],_名称を登録者で置換したコードならび)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/19 # # 【 課題 】初期位置 (X0, Y0) からx方向、y方向に初速度 (A, B) で物体を投げたとき、 #       y=0となるまでの物体の軌跡を出力するプログラムを作成しなさい。 #       プログラムは複数のクラスを定義して作成すること。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】6/24 # 【 Ver  】java version "1.7.0_02" '初速_vx0,_t秒後の_x座標'(_x0,_vx0,_t,_x) :- _x is _vx0 * _t + _x0. '初速_vy0,_t秒後の_y座標'(_y0,_vy0,_t,_y) :- _y is _vy0 * _t - (9.8 * _t * _t) / 2 + _y0. '初期位置 (X0, Y0) からx方向、y方向に初速度 (A, B) で物体を投げたとき、y=0となるまでの物体の軌跡を出力する'(_X0,_Y0,_A,_B) :- '初期位置 (X0, Y0) からx方向、y方向に初速度 (A, B) で物体を投げたとき、y=0となるまでの物体の軌跡を出力する'(0,0,0,_A,_B,_x,_y,L1), 座標位置置換(100,100,L1,L2), 物体の軌跡を出力する(L2). '初期位置 (X0, Y0) からx方向、y方向に初速度 (A, B) で物体を投げたとき、y=0となるまでの物体の軌跡を出力する'(_,_X0,_Y0,_A,_B,_x,_y,[]) :- _y < 0,!. '初期位置 (X0, Y0) からx方向、y方向に初速度 (A, B) で物体を投げたとき、y=0となるまでの物体の軌跡を出力する'(_t,_X0,_Y0,_A,_B,_x,_y,[[_x,_y]|R]) :- _t_2 is _t + 0.01, '初速_vx0,_t秒後の_x座標'(_X0,_A,_t_2,_x_2), '初速_vy0,_t秒後の_y座標'(_Y0,_B,_t_2,_y_2), '初期位置 (X0, Y0) からx方向、y方向に初速度 (A, B) で物体を投げたとき、y=0となるまでの物体の軌跡を出力する'(_t,_X0,_Y0,_A,_B,_x_2,_y_2,R). 座標位置置換(_,_,[],[]). 座標位置置換(_x変位,_y変位,[[_x_1,_y_1]|R1],[_x_2,_y_2|R2]) :- _x_2 is _x_1 + _x変位, _y_2 is _y_1 + _y変位, 座標位置置換(_x変位,_y変位,R1,R2). 物体の軌跡を出力する(L) :- newpage, moveto(100,100), setlinewith(1), curveto(L), stroke, showpage. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/26 # # 教えてください。複数行からのある文字列を含んだ # 行の検索の記述方法です # # ●正規表現の使用環境 # Java7 # # ●検索か置換か? # 検索 # # ●説明 # 複数ある文字行からの検索で # 一行中に[A]and[C]を含む行を抽出する方法 # 一行中に[K]or[S]を含む行を抽出する方法 # # # ●対象データ # ABCDEFG # HIJKLMN # OPQRSTU # # ●希望する結果 # ABCDEFG (A and C) # HIJKLMN と OPQRSTU  (K or S) # # # # '複数ある文字行からの検索で一行中に[A]and[C]を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に[A]and[C]を含む行を'(_適合行). '一行中に[A]and[C]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'A'), sub_atom(_文字行,_,1,_,'C'),!. '複数ある文字行からの検索で一行中に[K]or[S]を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に[K]or[S]を含む行を'(_適合行). '一行中に[K]or[S]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'K'),!, '一行中に[K]or[S]を含む行を'(_文字行) :- sub_atom(_文字行,_,1,_,'S'),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/28 # # ../test/read.cgi/tech/1340383120/27 # うあ!早々にありがとうございます。 # あまえついでに検索対象が「単語」になった場合はどうしたら良いでしょうか? # # # ●正規表現の使用環境 # Java7 # # ●検索か置換か? # 検索 # # ●説明 # # 複数ある文字行からの検索で【単語A】【単語B】をand/or検出 # # ●対象データ # # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行)浦島太郎はかめにのって海に出て行きました(改行) # そうすると、おじいさんは「わたしは小さなつづらでよい」といいました(改行) # # ●希望する結果 # # 「おじいさん」and「おばあさん」 # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行) # 「おじいさん」or 「おばあさん」 # むかしむかし、おじいさんは山に芝刈りに、おばあさんは川に洗濯に行きました(改行)そうすると、おじいさんは「わたしは小さなつづらでよい」といいました(改行) # '複数ある文字行からの検索で一行中に「おじいさん」and 「おばあさん」を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に「おじいさん」and 「おばあさん」を含む行を'(_適合行). '一行中に「おじいさん」and 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,'おじいさん'), sub_atom(_文字行,_,_,_,'おばあさん'),!. '複数ある文字行からの検索で一行中に「おじいさん」or 「おばあさん」を含む行を抽出する方法'(_複数ある文字行,_適合行) :- split(_複数ある文字列,['\n'],_文字行ならび), member(_適合行,_文字行ならび), '一行中に「おじいさん」or 「おばあさん」を含む行を'(_適合行). '一行中に「おじいさん」or 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,おじいさん),!, '一行中に「おじいさん」or 「おばあさん」を含む行を'(_文字行) :- sub_atom(_文字行,_,_,_,おばあさん),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/102 # # 正規表現での置き換え文字列をランダム化する方法はありませんか? # # 例 # 検索文字列 半角スペースで挟まれたアルファベット4文字 # ( )(\w{1})(\w{1})(\w{1})(\w{1})( ) # 置き換え結果 以下から ランダムでどれかを出力 # \1●●\3\4\5 # \1●\2●\4\5 # \1●\2\3●\5 # \1\2●●\4\5 # \1\2●\3●\5 # \1\2\3●●\5 # 分かる方いましたらお願いします。 # サクラエディタつかってますが # 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(_文字列,A,B,C,D,E,F,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[' '|R2],L3), append(L1_1,[' '],R2), \+(member(' ',L1_1)), ランダムに置換候補文字列を得る(A,B,C,D,E,F,_置換候補文字列), 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(S3,A,B,C,D,E,F,_置換された文字列_2), atomic_list_concat([S1,' ',_置換候補文字列,' ',_置換された文字列_2],_置換された文字列),!. 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(_文字列,A,B,C,D,E,F,_文字列). ランダムに置換候補文字列を得る(A,B,C,D,E,F,_置換候補文字列) :- R is random(6) + 1, 置換候補文字列(R,A,B,C,D,E,F,_置換候補文字列). 置換候補文字列(1,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●●,C,D,E],__文字列),!. 置換候補文字列(2,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●,B,●,D,E],__文字列),!. 置換候補文字列(3,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,●,C,●,E],__文字列),!. 置換候補文字列(4,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,●●,D,E],__文字列),!. 置換候補文字列(5,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●,C,D,●,E],__文字列),!. 置換候補文字列(6,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,C,●●,E],__文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/932 # # SQLの質問がありまして、書きます。 # # Aテーブル # A B C # 1 11 # 2 22 # 3 33 # # # Bテーブル # A B C # 4 44 1 # 5 55 2 # 6 66 # # 欲しい結果 # A B # 1 44 # 2 55 # 3 33 # 6 66 # # BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。 # 何かアドバイスお願いします。。。。。 # 調べても、よくわからなかったので。。。 # お願いします。。。 # 'BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。'(A,B) :- findall([A,C],( 'Aテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はBの値はBテーブルのものに置換される'(A,C)), L1), findall([A,B],( 'Bテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はこれを除く'(A,B,C)), L2), append(L1,L2,L), member([A,B],L). 'Aテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はBの値はBテーブルのものに置換される'(A,X) :- 'Aテーブル'(A,B), 'Bテーブルと結合可の時はBテーブルのCを使う'(A,C). 'Bテーブルの値を収集する。ただし、AテーブルAとBテーブルをCを鍵に結合できる時はこれを除く'(A,B,C) :- 'Bテーブル'(A,B,C), 'Aテーブルと結合可のものは除く'(C). 'Bテーブルと結合可の時はBテーブルのCを使う'(A,C) :- 'Bテーブル'(_,C,A),!. 'Bテーブルと結合可の時はBテーブルのCを使う'(A,A). 'Aテーブルと結合可のものは除く'(C) :- \+('Aテーブル'(_,C)). % 以下のサイトは ガウス法によるLU分解(_n,LL,LU,L,U) :- 解が生成される変数行列とその転置行列の生成(_n,LU,LU2), 転置(LL,LL2), ガウス法によるLU分解(LL,LL2,LU,LU2), 'LとUに分解'(LU,L,U),!. 解が生成される変数行列とその転置行列の生成(_n,LU,LU2) :- length(LU,_n), findall(L,( between(1,_n,_), length(L,_n)), LU), 転置(LU,LU2),!. ガウス法によるLU分解([],[],[],[]) :- !. ガウス法によるLU分解([[A|L1]|R1],[[A|L2]|R2],[[A|L3]|R3],[[A|L2]|R4]) :- '第一行は各列を隅要素(A)で割って置換する'(A,L1,L3), 第二行以下は次の対象矩形を生成する(L2,L3,R1,_次の対象矩形), '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41), 転置(_次の対象矩形,_転置された次の対象矩形), ガウス法によりLu分解(_次の対象矩形,_転置された次の対象矩形,R31,R41), '第一行は各列を隅要素(A)で割って置換する'(A,[],[]). '第一行は各列を隅要素(A)で割って置換する'(A,[A1|R1],[B1|R2]) :- 'A1をAで割る'(A,A1,B1), '第一行は各列を隅要素(A)で割って置換する'(A,R1,R2). 'A1をAで割る'(A,A1,B1) :- 行基本変形除算(A,1,A1,B1). 第二行以下は次の対象矩形を生成する([],_,[],[]) :- !. 第二行以下は次の対象矩形を生成する([A|R1],L2,[[_|L3]|R3],[L|R]) :- '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,L2,L3,L), 第二行以下は次の対象矩形を生成する(R1,L2,R3,R). '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(_,[],[],[]) :- !. '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,[B|R2],[C|R3],[D|R4]) :- 'D is C - A * B'(A,B,C,D), '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,R2,R3,R4). 'D is C - A * B'(A,B,C,D) :- 行基本変形乗算(A,B,V), 行基本変形減算(C,V,D),!. '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([],[],[],[]). '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([[_|L3]|R3],[[_|L4]|R4],[L3|R31],[L4|R41]) :- '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'LとUに分解'(LU,L,U) :- 'Lに分解'(LU,L), 'Uに分解'(LU,U). 'Lに分解'(LU,LL) :- findall(L2,( member(L1,LU), append(L0,R,L1), \+(L0 = []), '残り要素Rをすべて0に置き換える'(L0,R,L2)), LL). '残り要素Rをすべて0に置き換える'(L0,R,L2) :- length(R,Len), length(R1,Len), all(R1,0), append(L0,R1,L2),!. 'Uに分解'(LU,UU) :- findall(L2,( member(L,LU), append(L0,L1,L), 'L0の全要素を0に置き換える'(L0,L1,L2)), UU). 'L0の全要素を0に置き換える'(L,L0,[A|R1],L2) :- length(L0,Len), length(L0_2,Len), all(L0_2,0), 'L1を先頭要素で割る'(L1,L1_2), append(L0_2,L1_2,L2),!. 'L1を先頭要素で割る'([_先頭要素|R1],[1|R2]) :- findall(M,( member(A,R1), 分数を含む除算(A,_先頭要素,M)), R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行基本変形乗算(_乗数_1,_乗数_2,X) :- integer(_乗数_1), integer(_乗数_2), X is _乗数_1 * _乗数_2,!. 行基本変形乗算(_分子_1/_分母_1,_分子_2/_分母_2,X) :- _分子 is _分子_1 * _分子_2, _分母 is _分母_1 * _分母_2, 約分(_分子 / _分母,X),!. 行基本変形乗算(_分子/_分母,_乗数_2,X) :- A is _分子 * _乗数_2, 0 is A mod _分母, X is A // _分母,!. 行基本変形乗算(_乗数_1,_分子/_分母,X) :- atomic(_乗数_1), 行基本変形乗算(_分子/_分母,_乗数_1,X),!. 行基本変形乗算(_乗数_1,_乗数_2,X) :- X is _乗数_1 * _乗数_2,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), 約分(A2 / _除数,X),!. 行基本変形除算(A,_乗数,_除数,X) :- X is A * _乗数 / _除数. 行基本変形減算(A,B,C) :- atomic(A), atomic(B), C is A - B,!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B1, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B2 - B1 * A2, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B,X) :- atomic(B), _分子 is A1 - A2 * B, _分母 is A2, 約分(_分子 / _分母,X),!. 行基本変形減算(B,A1/A2,X) :- 行基本変形減算(A1/A2,B,X),!. 行基本変形減算(A,B,X) :- X is A - B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは % % 文字列置換には、 % 1) 一ヶ所書き換えたらそれで終わり % 2) 複数置換可能の箇所かあれば、全部書き換える % 3) 先頭から書き換え可能の部分を順にさらに次の書き換え候補を置換しに行くか % 問い合わせながら置換する % 4) 先頭から書き換え可能の部分を書き換えてみるが、外部からtrueの指示が % ない場合は、元に戻して次の候補に進む。 % の三方式が考えられる。ここではその 3)の「非決定的に順に置換する」を定義する。 % 文字列を非決定的に順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列). 文字列を非決定的に順に置換する(_文字列,_,_,_文字列). 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- 文字列を非決定的に順に置換する(_後文字列,_置換対象副文字列,_置換文字列,_置換された後文字列), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/141 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # ●▼■ の部分をマッチさせたい # # ●対象データ # ほげほげ●▼■ほげおわり # ほげほげ●▼■ほげここまで # # ●希望する結果 # ●▼■ # # ほげほげ(?<1>.+?)ほげおわり|ほげここまで # # のように書きましたがだめみたいです。 # これだと # ほげほげ(?<1>.+?)ほげおわり もしくは # ほげここまで # という風になってしまうのでしょうか? # ほげおわり か ほげここまで のどちらかという書き方を教えてほしいです。 # # '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), '「ほげほげ」で始まり'(S2,S2_1), '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1), '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S1,S2,S3). '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(_前文字列,_検索文字列,_後文字列,_前文字列,_検索文字列,_後文字列). '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S1,S2,S3,_前文字列,_検索文字列,_後文字列) :- '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S3,_前文字列_1,_検索文字列,_後文字列), atomic_list_concat([S1,S2,_前文字列_1],_前文字列). '「ほげほげ」で始まり'(S2,S2_1) :- sub_atom(S2,0,4,R,ほげほげ), sub_atom(S2,4,R,0,S2_1),!. '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1) :- sub_atom(S2_1,S1,Len,0,ほげほげおわり), \+((sub_atom(S2_1,_,_,E,ほげほげ),E>3)). '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1) :- sub_atom(S2,_,_,0,ほげほげここまで), \+((sub_atom(S2_1,_,_,E,ほげほげ),E>4)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/301 # # よろしくお願いします。 # # ●正規表現の使用環境 # サクラエディタ bregonig.dll Ver.3.02 # # ●検索か置換か? # 検索 # # ●説明 # "START"から"END"に囲まれた"HOGE"を最短一致(というのか?)で含まれる行を検索したい # # ●対象データ # 1.xxxxxxxSTARTyyyyyyyyHOGEzzzzzzzzzzzENDaaaaaaa # 2.xxxxxxxSTARTyyyyyyyyENDbbbbbbbHOGEzzzzzzzzzzzENDaaaaaaa # # ●希望する結果 # 1.だけマッチ # 2.は"END"が"HOGE"の前に入ってるのでマッチ対象外 # # '"START"から"END"に囲まれた"HOGE"を最短一致(というのか?)で含まれる行を検索したい '(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,'HOGE',_後文字列,_,_,_), sub_atom(_前文字列,_,_,_,_,'START',_前文字列_3,_,_,_), \+(sub_atom(_前文字列_3,_,5,_,'START')), \+(sub_atom(_前文字列_3,_,3,_,'END')), sub_atom(_後文字列,_,_,_,_後文字列_1,'END',_,_,_,_), \+(sub_atom(_後文字列_1,_,5,_,'START')),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/296 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # タグの外にある文字列を順に取り出したい # # ●対象データ # <hoge><hoge></hoge>あああ<hoge><hoge></hoge>いいい<hoge></hoge>ううう<hoge><hoge>・・・ # # ●希望する結果 # while (m.Success) # の繰り返しの中であああ、いいい、ううう・・・と順に取り出していきたい # # よろしくお願いします。 # # タグの外にある文字列を順に取り出したい(_文字列,_タグの外にある文字列) :- atom_chars(_文字列,Chars), タグの外にある文字列を順に取り出したい(Chars,[],_タグの外にある文字列). タグの外にある文字列を順に取り出したい([],L,_タグの外にある文字列) :- \+(L=[]), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい(Chars,L,_タグの外にある文字列) :- タグを読み飛ばす(Chars,_残り文字ならび), atom_chars(_タグの外にある文字列,L). タグの外にある文字列を順に取り出したい([A|R],L,_タグの外にある文字列) :- append(L,[A],L2), タグの外にある文字列を順に取り出したい(R,L2,_タグの外にある文字列). タグを読み飛ばす(Chars,_残り文字ならび) :- タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび), append(_,_終了タグ,_残り文字ならび,_タグの後文字ならび),!. タグで始まっている(Chars,_タグ,_終了タグ,_タグの後の文字ならび) :- append(['<'|R1],['>'|_タグの後の文字ならび],Chars), \+(member('<',R1)), \+(member('>',R1)), append(['<','/'|R1],['>'],_終了タグ),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/311 # # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換したファイル名) :- sub_atom(_ファイル名,_,_,2,_末尾文字2桁), 数字桁数評価(_末尾文字2桁,1), atomic_list_concat([_ファイル名,'0'],_置換したファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名). 数字桁数評価(_末尾文字2桁,2) :- atom_number(_末尾文字2桁,_数字),!. 数字桁数評価(_末尾文字2桁,2) :- sub_atom(_末尾文字2桁,1,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_数字),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/311 # # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_特定の文字から,_特定の文字の前まで,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[_特定の文字から|R2],[_特定の文字の前まで|_]), atomic_list_concat([S1,S3],_置換された文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/357 # # ●正規表現の使用環境 # MSVC2012 / .NET Framework 4.5 # # ●検索か置換か? # 検索 # # ●説明 # 「|」「(」「)」が文字として入っているデータから、特定の文字列を抜き出したい。 # # ●対象データ # area|name (value) # # tokyo|yamada benzo (123) # kyoto|namae tarou (21) # saga|shitemo mitukaranai you (7) # # ●希望する結果 # area, name, value # # "tokyo", "yamada benzo", "123" # "kyoto", "namae tarou", "21" # "saga", "shitemo mitukaranai you", "7" # # このように取り出したいのですが、どのように書くとよいでしょうか # # 文字列の整形(_文字列,_整形された文字列) :- split(_文字列,['|','(',')'],L_1), 各要素の末尾の空白を取り除く(L_1,L_2), 文字列に整形する(L_2,'',_整形された文字列). 各要素の末尾の空白を取り除く([],[]). 各要素の末尾の空白を取り除く([A|R1],[B|R2]) :- 末尾の空白を取り除く(A,B), 各要素の末尾の空白を取り除く(R1,R2). 末尾の空白を取り除く(A,B) :- atom_cahrs(A,Chars), append(L1,L2,Chars), all(L2,' '), atomic_list_concat(L1,B),!. 末尾の空白を取り除く(A,A). 文字列に整形する([A],S_1,S) :- atomic_list_concat([S_1,'"',A,'"'],S),!. 文字列に整形する([A|R],S_1,S) :- atomic_list_concat([S_1,'"',A,'", '],S_2), 文字列に整形する(R,S_2,S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1355011916/198 # # phpですがwebじゃないので、こちらで質問させて下さい # 趣味でプログラムをはじめて半年程度です # # 競馬のデータ処理をやっています # 数字と記号の混ざった文字列の数字部分を置き換えたいのですが # どうすればいいでしょうか? # # 具体的には、各馬の各コーナーの通過順位を以下のように馬番から着順に置き換えたいのです # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) *各馬の各コーナー通過順位 馬番表示 ←コレを # (10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12) *各馬の各コーナー通過順位 着順表示 こうしたい # # # 現在データは、以下のようになっています # # 各馬の各コーナー通過順位 馬番表示は $corner *先週の朝日杯の3コーナー # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) # # 馬番は $umban # Array ( [0] => 14 [1] => 15 [2] => 2 [3] => 5 [4] => 9 [5] => 12 [6] => 16 [7] => 3 [8] => 8 [9] => 6 [10] => 10 [11] => 13 [12] => 4 [13] => 11 [14] => 7 [15] => 1 ) # # 着順は $tyaku # Array ( [0] => 1 [1] => 16 [2] => 10 [3] => 2 [4] => 8 [5] => 4 [6] => 6 [7] => 3 [8] => 9 [9] => 7 [10] => 15 [11] => 14 [12] => 13 [13] => 11 [14] => 5 [15] => 12 ) # # $umbanと$tyakuの相関性は、[0]は14番で1着、[1]は15番で16着、[2]は2番で10着、、etcとなっています # # phpです、宜しくお願いします *分割で見にくくなってしまいすいません # # # 11R 第64回 朝日杯フューチュリティステークス(GI)成績 # # サラ系2歳,1600m,芝・右 外 # (国際)牡・牝(指定)オープン,馬齢 # 本,賞,金,:,7000,、,2800,、,1800,、,1100,、,700,万円 # 付加賞金,:,121.8,、,34.8,、,17.4,万円 # 発走 15:25 # 天候:晴   芝:良 # :- op(400,xfx,':'). コーナー通過時の先頭からの各馬の最終到達順位(_レース,_通過時文字列,_到達順位に置換した通過時文字列) :- sPLIT(_通過時文字列,['(','-','=','*',')'],L1), 馬番を最終到達順位に変換(_レース,L1,L2), atomic_list_concat(L2,_到達順に置換した通過時順位). 馬番を最終到達順位に変換(_レース,[],[]). 馬番を最終到達順位に変換(_レース,[_馬番|R1],[_着順|R2]) :- integer(_馬番), レース成績(_レース,_着順,_馬番,_馬名,_性齢,_負担重量,_騎手,_タイム,_着差,_推定上り,_馬体重,_調教師,_単勝人気), 馬番を最終到達順位に変換(_レース,R1,R2). 馬番を最終到達順位に変換(_レース,[A|R1],[A|R2]) :- \+(integer(A)), 馬番を最終到達順位に変換(_レース,R1,R2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',1,14, ロゴタイプ,牡2,55.0, M.デムーロ,1:33.4,'',36.1,482,-4, 田中剛,7). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',2,5, コディーノ,牡2,55.0, 横山典弘,1:33.4,クビ,36.0,476,+2, 藤沢和雄,1). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',3,3, ゴットフリート,牡2,55.0, C.スミヨン,1:33.8,2+1/2,36.0,470,+2, 斎藤誠,3). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',4,12, フラムドグロワール,牡2,55.0, C.ウィリアムズ,1:33.9,3/4,36.3,490, 0, 藤沢和雄,5). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',5,7, ティーハーフ,牡2,55.0, 武豊,1:33.9,クビ,35.5,436,-2, 西浦勝一,6). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',6,16, ノウレッジ,牡2,55.0, 蛯名正義,1:34.0,クビ,36.4,490,+2, 二ノ宮敬宇,10). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',7,6, ラブリーデイ,牡2,55.0, C.ルメール,1:34.0,クビ,36.2,472,-2, 池江泰寿,4). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',8,9,エーシントップ,牡2,55.0, 浜中俊,1:34.1,クビ,36.6,532,-2, 西園正都,2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',9,8, クラウンレガーロ,牡2,55.0, 幸英明,1:34.1,ハナ,36.3,456,+12, 日吉正和,8). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',10, 2, ネオウィズダム,牡2,55.0, 柴田善臣,1:34.2,1/2,36.8,484,+2, 矢作芳人,12). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',11, 11, アットウィル,牡2,55.0, 岩田康誠,1:34.2,クビ,36.0,482,-2, 領家政蔵,13). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',12, 1, ザラストロ,牡2,55.0, 松岡正海,1:34.3,クビ,35.8,492,+4, 武藤善則,11). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',13, 4, テイエムイナズマ,牡2,55.0, 池添謙一,1:34.5,1+1/2,36.3,510,+10, 福島信晴,9). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',14, 13, ディアセルヴィス,牡2,55.0, 勝浦正樹,1:34.6,3/4,36.5,454,+4, 高橋裕,16). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',15, 10, ワキノブレイブ,牡2,55.0, 福永祐一,1:34.7,クビ,36.6,468,+6, 清水久詞,15). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',16, 15,マイネルエテルネル,牡2,55.0, 柴田大知,1:34.9,1+1/4,37.6,470,-2, 西園正都,14). %%%%% 実行例 %%%% ?- コーナー通過時の先頭からの各馬の最終到達順位('11R 第64回 朝日杯フューチュリティステークス(GI)','(2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1)',_到達順位に置換した通過時文字列). _到達順位に置換した通過時文字列 = '(10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12)' % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/431 # # UPDATE list SET target=1 WHERE id=1 # というので更新をかけたいのですが、id=1が複数あります。 # どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか? # 最後に「LIMIT 1」とつけたら # SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが # こういったことが可能であれば構文的にご指摘いただけないでしょうか。 # # 'UPDATE list SET target=1 WHERE id=1 というので更新をかけたいのですが、id=1が複数あります。 どれでもいいのでid=1のものを1つ更新をかけたい' :- テーブルの更新(list,[id],[1],true,[target],[1]). テーブルの更新(_テーブル名,_鍵属性ならび,_鍵値ならび,_条件,_置換属性ならび,_置換値ならび) :- テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび), 鍵を設定する(_テーブル名,_鍵属性ならび,_鍵値ならび,_引数ならび), 条件に適合した節を削除する(P,_条件), 引数ならびの値を置換する(_テーブル名,_置換属性ならび,_置換値ならび,_引数ならび,_置換された引数ならび), 置換された節を先頭に加える(_テーブル名,_置換された引数ならび). 条件に適合した節を削除する(P,_条件) :- retract(P), '診断: 条件に適合した節を削除する'(P,_条件). '診断: 条件に適合した節を削除する'(P,_条件) :- call(_条件),!. '診断: 条件に適合した節を削除する'(P,_条件) :- asserta(P). テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_引数ならび), P =.. [_テーブル名|_引数ならび],!. 鍵を設定する(_,[],[],_引数ならび). 鍵を設定する(_テーブル名,[_鍵属性|R1],[_鍵値|R2],_引数ならび) :- テーブル定義(_テーブル名,_nth1,_鍵属性), nth1(_nth1,_引数ならび,_鍵値), 鍵を設定する(_テーブル名,R1,R2,_引数ならび). 引数ならびの値を置換する(_,[],[],_置換された引数ならび,_置換された引数ならび). 引数ならびの値を置換する(_テーブル名,[_置換属性|R1],[_置換値|R2],_引数ならび,_置換された引数ならび) :- テーブル定義(_テーブル名,_nth1,_置換属性), 要素番号によるならびの置換(_nth1,_置換値,_引数ならび,_引数ならび_2), 引数ならびの値を置換する(_テーブル名,R1,R2,_引数ならび_2,_置換された引数ならび). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- length([_|L0],_要素番号), append(L0,[_|R],_対象ならび), append(L0,[_置換要素|R],_置換ならび),!. 置換された節を先頭に加える(_テーブル名,_置換された引数ならび) :- P =.. [_テーブル名|_置換された引数ならび], asserta(P). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/595 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列). '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(0,_5列5行の多次元配列,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(10,_5列5行の多次元配列,_5列5行の多次元配列) :- !. 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N,_5列5行の多次元配列_1,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2), N_2 is N + 1, 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N2,_5列5行の多次元配列_2,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2) :- 列の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_1), 行の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_2), 二つの配列の論理積を取る(_置換された5列5行の多次元配列_1,_置換された5列5行の多次元配列_2,_5列5行の多次元配列_2). 行の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- '最終行を前、第一行を後ろに付加した5列6行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列), findall(L,( append(L0,[_前の行,_行,_後の行|R],_5列7行の多次元配列), '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,L)), _置換された5列5行の多次元配列). 列の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- 転置(_5列5行の多次元配列,_転置された5列5行の多次元配列), 行の置換(_転置された5列5行の多次元配列,_置換された転置された5列5行の多次元配列_1), 転置(_置換された転置された5列5行の多次元配列_1,_置換された5列5行の多次元配列). '最終行を前、第一行を後ろに付加した5列7行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列) :- last(_5列5行の多次元配列,_最終行), _5列5行の多次元配列 = [_第一行|_], append([_最終行|_5列5行の多次元配列],[_第一行],_5列7行の多次元配列),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_前の行),_前の行の1の個数), between(2,3,_前の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_後の行),_後の行の1の個数), between(2,3,_後の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_,_行,_,_行). 二つの配列の論理積を取る([],[],[]) :- !. 二つの配列の論理積を取る([L1|R1],[L2|R2],[L3|R3]) :- '2つのならび要素の論理積'(L1,L2,L3), 二つの配列の論理積を取る(R1,R2,R3). '2つのならび要素の論理積'([],[],[]) :- !. '2つのならび要素の論理積'([N1|R1],[N2|R2],[N3|R3]) :- N3 is N1 /\ N2, '2つのならび要素の論理積'(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/600 # # お願いします。 # # ●正規表現の使用環境 # Javascript # # ●検索か置換か? # 検索 # # ●説明 # HMVの商品IDらしき番号を取得したい # # ●対象データ # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889 # # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889/ref/1448035_8 # # ●希望する結果 # 1789889 # # 説明 # アンダーバー以降の末尾の自然数が商品IDなのですが(これなら簡単) # リファラー付きの場合は末尾じゃなくなるので初心者の自分には難しいです。 # なお、商品IDは0(ゼロ)で桁合わせはしていません # # 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- sub_atom(_文字列,S,5,_,'/ref/'), sub_atom(_文字列,0,S,_,_文字列_1), '商品IDは最後の_から末尾までの副文字列'(_文字列_1,_商品ID),!. 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID),!. '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID) :- atom_chars(_文字列,Chars), append(_,['_'|R1],Chars), \+(member('_',R1)), atom_chars(_商品ID,R1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/591 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # トップから第三レベルドメインまでをマッチさせたい。 # www.(mydomain.co.jp)※括弧の中 # サブドメインが無い場合も想定されます。 # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●対象データ # www.mydomain.co.jp # mydomain.co.jp # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●希望する結果 # mydomain.co.jp # mydomain.com # # よろしくお願いします。 # # 'トップから第三レベルドメインまでをマッチさせたい。'(_文字列,_第三レベルドメインまでの文字列) :- '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベルドメイン文字列), '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン), atomic_list_concat([_第三レベルドメイン,_第二第一レベルドメイン],_第三レベルドメインまでの文字列]). '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベル文字列) :- '第二・第一レベルドメイン'(_第二第一レベルドメイン), sub_atom(_文字列,S,Len,R,_第二第一レベルドメイン), sub_atom(_文字列,0,S,_,_第三以上レベル文字列). '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン) :- split(_第三以上レベルドメイン文字列,['.'],L), last(L,_第三レベルドメイン),!. '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/21 # # # ●Regular Expressionの使用環境 # Ruby 1.9 # # ●検索か置換か? # 検索 # # ●説明 # red または blue が含まれてない行を検索したい。 # # ●対象データ # yellow red blue green orange # red green yellow orange # black yellow orange white # green yellow blue orange # # ●希望する結果 # black yellow orange white 'red または blue が含まれてない行を検索したい。'(Lines,Line) :- member(Line,Lines), 'red または blue が含まれてない'(Line). 'red または blue が含まれてない'(Line) :- \+(sub_atom(Line,_,_,_,red)), \+(sub_atom(Line,_,_,_,blue)). % 以下のサイトは # このディレクトリの索引 # ●Regular Expressionの使用環境 # Ruby 1.9 # # ●検索か置換か? # 検索 # # ●説明 # red または blue が含まれてない行を検索したい。 # # ●対象データ # yellow red blue green orange # red green yellow orange # black yellow orange white # green yellow blue orange # # ●希望する結果 # black yellow orange white # 'red または blue が含まれてない行を検索したい。'([_文字列|R],_文字列) :- \+(sub_atom(_文字列,_,_,_,red)), \+(sub_atom(_文字列,_,_,_,blue)). 'red または blue が含まれてない行を検索したい。'([_|R],_文字列) :- 'red または blue が含まれてない行を検索したい。'(R,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/117 # # コメント内の任意の文字を全て半角スペースに置き換える正規表現は可能でしょうか? # aaaは固定ではなく、長さや文字も任意です。 # 文字数分スペースに置き換える必要があります。 # # 変換前 # /*aaa*/ # # 変換後 # /* */ # # 'コメント内の任意の文字を全て半角スペースに置き換える正規表現は可能でしょうか? aaaは固定ではなく、長さや文字も任意です。 文字数分スペースに置き換える必要があります。 変換前 /*aaa*/ 変換後 /* */'(_文字列,_置換された文字列) :- コメント内の任意の文字を全て半角スペースに置き換える(_文字列,_置換された文字列). コメント内の任意の文字を全て半角スペースに置き換える(_文字列,_置換された文字列) :- sub_atom(_文字列,'/*','*/',_,_,_,S1,S2,S3,L1,L2,L3), sub_atom(S2,2,Len,2,_), length(L0,Len), all(L0,' '), atomic_list_concat([S1,'/*',L0,'*/',S3],_置換された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/172 # # ●Regular Expressionの使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # Javaのコメント・文字列を抽出してタグで囲みたいです。 # /**/, "", '' が入れ子になってる場合に外側だけ適応するのができません # 失敗例 <ダブル>"これは<シングル>'ペン'</シングル>です"</ダブル> # 成功例 <ダブル>"これは'ペン'です"</ダブル> # # ●対象データ() # /* "hello" 'world' */ # String var="これは'ペン'です"; # String apos='apopo "/* moge'; # # ●希望する結果 # <コメント>/* "hello" 'world' */</コメント> # String var=<ダブル>"これは'ペン'です"</ダブル>; # String apos=<シングル>'apopo "/* moge'</シングル>; # # 'Javaのコメント・文字列を抽出してタグで囲みたいです。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '文字ならびからコメント・文字列を抽出してタグで囲む'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). '文字ならびからコメント・文字列を抽出してタグで囲む'([],[]). '文字ならびからコメント・文字列を抽出してタグで囲む'([''''|R1],[<,シ,ン,グ,ル,>,''''|L1]) :- 'シングルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'(['"'|R1],[<,ダ,ブ,ル,>,'"'|L1]) :- 'ダブルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([/,*|R1],[<,コ,メ,ン,ト,>,/,*|L1]) :- 'コメントの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([A|R1],[A|R2]) :- '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). シングルクォートの外側入れ子を変換(L,L1,R) :- append(L0,[''''|R],L), \+(member('''',R)), append(L0,['''',<,/,シ,ン,グ,ル,>|R],L1),!. ダブルクォートの外側入れ子を変換(L,L1,R) :- append(L0,['"'|R],L), \+(member('"',R)), append(L0,['"',<,/,ダ,ブ,ル,>|R],L1),!. コメントの外側入れ子を変換(L,L1,R) :- append(L0,[*,/|R],L), \+(append(_,[*,/|_],R)), append(L0,[*,/,<,/,コ,メ,ン,ト,>|R],L1),!. % 以下のサイトは # 数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 # 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 # これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。 :- op(200,fx,kazu). :- op(200,fx,tasu). :- op(200,fx,hiku). :- op(200,fx,kake). :- op(200,fx,waru). '数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。'(L,_式,_結果) :- 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果). 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果) :- 演算子を置換する(_ならび,_演算子を置換されたならび), atomic_list_concat(_演算子を置換されたならび,' ',_式文字列), atom_to_term(_式文字列,_式,_), _結果 is _式. 演算子を置換する([],[]). 演算子を置換する([kazu _値|R1],[_値|R2]) :- 演算子を置換する(R1,R2). 演算子を置換する([_演算子文字列 _値|R1],[_演算子,_値|R2]) :- '演算子文字列・演算子'(_演算子文字列,_演算子), 演算子を置換する(R1,R2). '演算子文字列・演算子'(tasu,+). '演算子文字列・演算子'(hiku,-). '演算子文字列・演算子'(kake,*). '演算子文字列・演算子'(waru,/). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/233 # # ●Regular Expressionの使用環境 # 秀丸 8.2.1 # ●検索か置換か? # 置換 # # ●説明 # 二つ目のTab以降を削除したいです。 # # ●対象データ # 100 こくご えいご 100 20 固定 # 共通 シャカイ スウガク 100 10 ランダム # # (データの間の空白は全部Tabです) # # ●希望する結果 # 100 こくご # 共通 すうがく # # # 下の正規表現で試してみました。 # ^(.*)?\t(.*)?\t[あ-ん ア-ン].* # \1\t\2 # (.*)?\t(.*)?\tでTabまでの最短マッチ(のつもり)二つで、えいご、スウガクまでを指定しています。 # # 3つめのカラムの1文字目がひらがなとカタカナなので、[あ-ん ア-ン]で指定しているのですが、 # 後ろの"ランダム"がマッチしてしまい、2行目が下のような結果になってしまいます。 # # 100 こくご # 共通 シャカイ スウガク 100 10 # # やり方教えて貰えればうれしいです。 # よろしくお願いします。 # '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '二つ目のTab以降を削除したいです。'(Chars,['\t','\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび). '二つ目のTab以降を削除したいです。'([A|_二つめのTab以降],[A],[A]) :- !. '二つ目のTab以降を削除したいです。'([A|R1],[A|R2],[A|R3]) :- '二つ目のTab以降を削除したいです。'(R1,R2,R3). '二つ目のTab以降を削除したいです。'([B|R1],L2,[B|R3]) :- '二つ目のTab以降を削除したいです。'(R1,L2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- atom_chars(_文字列,Chars), '一文字ずつ最初のTabが来るまで'(Chars,_Tabまでの文字ならび,_残り文字ならび_1), '二個目のTabが来るまで'(_残り文字ならび_1,_二個目のTabまでの文字ならび), append(_Tabまでの文字ならび,_二個目のTabまでの文字ならび,_二つ目のTabまでの文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTabまでの文字ならび). '一文字ずつ最初のTabが来るまで'(['\t'|_残り文字ならび],['\t'],_残り文字ならび) :- !. '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび) :- '一文字ずつ最初のTabが来るまで'([A|_残り文字ならび],[],_残り文字ならび),!. '二個目のTabが来るまで'(['\t'|_],['\t']) :- !. '二個目のTabが来るまで'([A|R1],[A|R2]) :- '二個目のTabが来るまで'(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 文字ならびに変換する(_文字列,_文字ならび), 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで), 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列). 文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 二つのTabが来るまで(_文字ならび,_最初のTabまで,_その後二つ目のTabまで) :- append(L1,['\t'|R2],['\t'|_],_文字ならび). 文字列を復元(_最初のTabまで,_その後二つ目のTabまで,_二つ目のTab以降を削除後の文字列) :- append(_最初のTabまで,['\t'|_その後二つめのTabまで],['\t'],_二つ目のTab以降を削除後の文字ならび), atom_chars(_二つ目のTab以降を削除後の文字列,_二つ目のTab以降を削除後の文字ならび),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '二つ目のTab以降を削除したいです。'(_文字列,_二つ目のTab以降を削除後の文字列) :- 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列), それ以後の文字列の最初に現れたTabを含めた長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ), _長さ is _最初のTabを含めたそこまでの文字列の長さ + _それ以後の文字列の最初に現れたTabを含めた長さ, sub_atom(_文字列,0,_長さ,_,_二つ目のTab以降を削除後の文字列),!. 最初のTabから後の副文字列を得る(_文字列,_最初のTabを含めた文字列の長さ,_それ以後の文字列) :- sub_atom(_文字列,St1,1,R,'\t'), _最初のTabを含めたそこまでの文字列の長さ is St1 + 1, sub_atom(_文字列,_最初のTabを含めた文字列の長さ,R,0,_それ以後の文字列). それ以後の文字列の最初に現れたTabを含めた最初からの長さ(_それ以後の文字列,_それ以後の文字列の最初に現れたTabを含めた長さ) :- sub_atom(_それ以後の文字列,St,1,_,'\t'), _それ以後の文字列の最初に現れたTabを含めた長さ is St + 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行を読み込み、別のテキストへ右縦書きで書き出す'(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/tech/1362913813/370 # # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは # # Aを置換対象要素 # Bを置換要素 # 第三引数に対象リスト # 第四引数に置換されたリスト # 置換(A,B,[A|R],L) :- 置換_1(A,B,R,L). 置換(A,B,[C|R1],[C|R2]) :- \+(A=C), 置換(A,B,R1,R2). 置換_1(A,B,R,[B|R]). 置換_1(A,B,R1,[B|R2]) :- 置換(A,B,R1,R2). % ?- 置換(a,x,[f,a,y,a,b],L). % % L = [f,x,y,a,b]; % L = [f,x,y,x,b]; % false. % ?- % 以下のサイトは # # Aを置換対象要素 # Bを置換要素 # 第三引数に対象リスト # 第四引数に置換されたリスト # 置換(_置換対象要素,_置換要素,[_置換対象要素|R],L) :- 置換_1(_置換対象要素,_置換要素,R,L). 置換(_置換対象要素,_置換要素,[_要素|R1],[_要素|R2]) :- \+(_置換対象要素=_要素), 置換(_置換対象要素,_置換要素,R1,R2). 置換_1(_,_置換要素,R,[_置換要素|R]). 置換_1(_置換対象要素,_置換要素,R1,[_置換要素|R2]) :- 置換(_置換対象要素,_置換要素,R1,R2). % ?- 置換(a,x,[f,a,y,a,b],L). % % L = [f,x,y,a,b]; % L = [f,x,y,x,b]; % false. % ?- % 以下のサイトは 順に置換していく(_置換対象要素,_置換要素,_置換対象ならび,_置換されたならび) :- _置換対象ならび = [_要素_1|_残りならび], 要素が置換対象要素の場合は置換する(_置換対象要素,_置換要素,_要素_1,_要素_2), 順に置換していく(_置換対象要素,_置換要素,_要素_2,_残りならび,_置換されたならび). 順に置換していく(_置換対象要素,_置換要素,_置換要素,_残りならび,[_置換要素|_残りならび]). 順に置換していく(_置換対象要素,_置換要素,_要素,_残りならび_1,[_要素|_残りならび_2]) :- 順に置換していく(_置換対象要素,_置換要素,_残りならび_1,_残りならび_2). 要素が置換対象要素の場合は置換する(_置換対象要素,_置換要素,_置換対象要素,_置換要素). 要素が置換対象要素の場合は置換する(_置換対象要素,_,_要素,_要素) :- \+(_置換対象要素=_要素). % ?- 順に置換していく(a,x,[f,a,y,a,b],L). % % L = [f,x,y,a,b]; % L = [f,x,y,x,b]; % false. % ?- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/397 # # 質問です # # ●正規表現の使用環境 # PHP5.3.3 # # ●検索か置換か? # 置換 # # ●説明 # ・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 # ・それ以外ならaタグへ変換。 # ・URLに日本語が含まれていた場合も、スペースや改行、文字列の終端にくるまでのものも上記のようにリンク化 # # ●対象データ # [1] こちらへ→http://ime.nu/example.com/index.html # [2] 写真はこれです→https://example.com/写真.jpg # # ●希望する結果 # [1] こちらへ→<a href="http://ime.nu/example.com/index.html">http://example.com/index.html</a> # [2] 写真はこれです→<img src="https://example.com/写真.jpg" /> # # '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ),!. '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- 'jpg,png,gifなら'(_URL部分文字列), 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifなら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), member(_サフィックス部分文字列,['.jpg','.png','.gif']). 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- atomic_list_concat([_前文字列,'',_後文字列],_imgタグ). 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- 'それ以外なら'(_URL部分文字列), 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ). 'それ以外なら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), \+(member(_サフィックス部分文字列,['.jpg','.png','.gif'])). 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- atomic_list_concat([_前文字列,'',_URL部分文字列,'',_後文字列],_aタグ). 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,A), member(A,['http://','file://','ftp://']), S_2 is S + Len, 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列). 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S_2,_,0,_副文字列), 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列), sub_atom(_文字列,0,S,_,_前文字列),!. 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列) :- sub_atom(_副文字列,S,1,R,_文字), member(_文字,[' ','\t','\n']), sub_atom(_副文字列,0,S,R,_URL部分文字列), sub_atom(_副文字列,_,R,0,_後文字列),!. 区切り文字で分割(_URL部分文字列,_URL部分文字列,''). % 以下のサイトは # # 単純な置換 s/_a/_b/ # 's/a/b/'(_文字列,_置換された文字列) :- 's/_a/_b/'(_文字列,a,b,_置換された文字列). 's/_a/_b/'(_文字列,_a,_b,_置換された文字列) :- 単純な文字列置換(_文字列,_a,_b,_置換された文字列). 単純な文字列置換(_文字列,_a,_b,_置換された文字列) :- '_aを決定性に探索する'(_文字列,_a,_b,_前文字列,_後文字列), 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列). 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_b,_後文字列],_置換された文字列). 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列) :- 単純な文字列置換(_後文字列,_a,_b,_置換された文字列_2), atomic_list_concat([_前文字列,_b,_置換された文字列_2],_置換された文字列). '_aを決定性に探索する'(_文字列,_a,_b,_前文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_a), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは 解釈実行((_目標_1 , _目標_2)) :- !, 解釈実行連言(_目標_1,_目標_2). 解釈実行((_目標_1 ; _目標_2)) :- !, 解釈実行選言(_目標_1,_目標_2). 解釈実行(_副目標) :- 定義述語(_副目標), !, 定義述語解釈実行(_副目標). 解釈実行(_副目標) :- call(_副目標). 解釈実行連言(_目標_1,_目標_2) :- 解釈実行置換((_目標_1 , _目標_2),_目標), call(_目標). 解釈実行選言(_目標_1,_目標_2) :- 解釈実行置換((_目標_1 , _目標_2),_目標), call(_目標). 定義述語(_副目標) :- predidate_property(_副目標,_述語の属性), \+(_述語の属性=builtin), \+(_述語の属性=undefined),!. 定義述語解釈実行(_副目標) :- clause(_副目標,_本体), 解釈実行置換(_本体,_置換された本体), call(_置換された本体). 解釈実行置換(((!) , Q),((!) , Q2)) :- 解釈実行置換(Q,Q2),!. 解釈実行置換((_副目標 , Q),(解釈実行(_副目標) , Q2)) :- 解釈実行置換(Q,Q2),!. 解釈実行置換((_副目標 ; Q),(解釈実行(_副目標) ; Q2)) :- 解釈実行置換(Q,Q2),!. 解釈実行置換(!,!) :- !. 解釈実行置換(_副目標,解釈実行(_副目標)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/419 # # ●Regular Expressionの使用環境 # sakura editor # # ●検索か置換か? # 置換 # # ●説明 # xmlのtaxiwaypath要素のなかに # type="TAXI"と centerLineLighted="FALSE"が存在するときに、 他の属性を書き換えずにcenterLineLighted="TRUE"に書き換えたいです # # ●対象データ # <TaxiwayPath # type="TAXI" # … # centerLineLighted="FALSE" # … # /> # # ●希望する結果 # <TaxiwayPath # type="TAXI" # … # centerLineLighted="TRUE" # … # /> # # …は省略していると言う意味です # # ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_置換された文字列) :- sPLIT(_文字列,['>',' ','\n','\t'],_区切りを含む要素ならび), ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" にする'(R2,R2_2), atomic_list_concat(_置換された区切りを含む要素ならび,_置換された文字列),!. ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_文字列). ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(R2,_置換された区切りを含む要素ならび) :- append(L1,[''|R3],_区切りを含む要素ならび), \+(member('>',R2)), member('type="TAXI"',R2), ならびの置換(R2,'centerLineLighted="FALSE"','centerLineLighted="TRUE"',R2_2), append(L1,[''|R3],_置換された区切りを含む要素ならび),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- findall(N,between(1,81,N),L_1), '81以下の自然数で九九に現れない数を昇順ですべて'(1,1,L_1,L_2), '表示せよ。'(L_2). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_,L,L) :- _n_1 > 9,!. '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L) :- _n_2 > 9, _n_1_2 is _n_1 + 1, '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1_2,1,L_1,L). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L_2) :- _n_3 is _n_1 * _n_2, 空白に置換(_n_3,L_1,L_2), _n_2_2 is _n_2 + 1, '81以下の自然数で九九に現れない数を'(_n_1,_n_2_2,L_3,L). 空白に置換(N,L_1,L_2) :- append(L0,[N|R],L_1), append(L0,[' '|R],L_2). 表示せよ(L) :- atomic_list_concat(L,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: 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)), [_,_短縮した文字列]). % 以下のサイトは 行列から行を取り出す(_行列,_行) :- 行列から行を取り出す(_行列,_,_行). 行列から行を取り出す(_行列,_行目,_行) :- nth1(_行目,_行列,_行). 行列から列を取り出す(_行列,_列) :- 行列から列を取り出す(_行列,_nth1,_列). 行列から列を取り出す(_行列,_列目,_列) :- 転置(_行列,_転置された行列), nth1(_列目,_転置された行列,_列). 行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :- nth1(_行目,_行列,_行), nth1(_列目,_行,_要素). 行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :- findall(_置換された行,( member(_行,_行列), 行を全置換する(_行,_置換対象値,_置換値,_置換された行)), _置換された行列). 行を全置換する([],_,_,[]). 行を全置換する([A|R1],A,B,[B|R4]) :- 行を全置換する(R1,A,B,R4),!. 行を全置換する([C|R1],A,B,[C|R4]) :- 行を全置換する(R1,A,B,R4). 行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :- 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび), 行の列要素を置換する(_行,_列目,_値,_置換された行),!, append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列). 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :- _行目_1 is _行目 - 1, length(_それまでの行ならび,_行目_1), append(_それまでの行ならび,[_行|_それより後の行ならび],_行列). 行の列要素を置換する(_行,_列目,_値,_置換された行) :- _列目_1 is _列目 - 1, length(L0,_列目_1), append(L0,[_|R],_行), append(L0,[_値|R],_置換された行). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 > _行目_2, 行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 < _行目_2, 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2), 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1), append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2), append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列). 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :- _行目_2_1 is _行目_2 - 1, length(_前ならび_2,_行目_2_1), append(_前ならび_2,[_行_2|_後ろならび_2],_行列). 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :- _行目_1_1 is _行目_1 - 1, length(_前ならび_1,_行目_1_1), append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2). 行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :- 転置(_行列,_転置された行列), 行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列), 転置(_入れ替えた転置された行列,_入れ替えた行列). 行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :- _行目_1 is _行目 - 1, length(L0,_行目_1), append(L0,[_行|R],_行列), 行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行), append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列). 行要素全てをn倍する([],_,[]) :- !. 行要素全てをn倍する([A|R1],_n倍,[B|R2]) :- B is A * _n倍, 行要素全てをn倍する(R1,_n倍,R2). 列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :- 転置(_行列,_転置された行列), 行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列), 転置(_行がn倍された転置された行列,_列がn倍された行列). 二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :- 行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1), 行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2), 最小公倍数を取る(_要素_1,_要素_2,_最小公倍数), _行目_1の倍数 is _最小公倍数 // _要素_1, _行目_2の倍数 is _最小公倍数 // _要素_2, 行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2), 行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # "0000000000"のような文字列を用意しておいて、"123" のような # 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? # 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。 # # C言語でいうsprintf(%10d, 123)みたいなフォーマットを正規表現で簡単に # 再現できますか? '"0000000000"のような文字列を用意しておいて、"123" のような 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。'(_置換対象文字列,_置換文字列,_置換された文字列) :- atom_length(_置換文字列,_文字長), sub_atom(_置換対象文字列,S1,S2,S3), atom_length(S2,_文字長), atomic_list_concat([S1,_置換文字列,S3],_置換された文字列). % *** user: sub_atom / 4 *** sub_atom(A,H,X,T) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは # # ●Regular Expressionの使用環境 # Visual C# # # ●検索か置換か? # 検索 # # ●説明 # 同じ文字が5回以上繰り返されている箇所のある行を検索したい # # ●対象データ→結果 # うわあああああい → マッチ # aaaaaaaa      → マッチ # あいあいあい   → マッチせず # 同じ文字が5回以上繰り返されている箇所のある行を検索したい(_文字列,_行) :- split(_文字列,['\n'],_行ならび), 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行). 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行) :- nth1(_,_行ならび,_行), 同じ文字が5回以上繰り返されている箇所のある行(_行). 同じ文字が5回以上繰り返されている箇所のある行(_文字列) :- sub_atom(_文字列,_,5,_,_適合文字列), atom_chars(_適合文字列,[A,A,A,A,A]),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 # '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,S,Len,R,_A), sub_atom(_文字列,0,S,0,_前文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))), sub_atom(_文字列,_,R,0,_後文字列). 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,_前文字列,_A,_後文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))),!. 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # 均等割りにしているスペースを削除したい(_文字列,_スペースを削除した文字列) :- atom_chars(_文字列,_文字ならび), 均等割りにしているスペースを削除したい(_文字列,_均等割長さ,_スペースを削除した文字列), atom_chars(_スペースを削除した文字列,_スペースを削除した文字ならび). 均等割りにしているスペースを削除したい(_文字ならび,_均等割長さ,_文字ならび) :- 要素のどれもスペースではない(_文字ならび), length(_文字ならび,_均等割長さ),!. 均等割りにしているスペースを削除したい(_文字ならび,_均等割長さ,_スペースを削除した文字ならび) :- 均等割りにしているスペースを(_文字ならび,_均等割長さ,_文字ならび_1,_残り文字ならび), 均等割りにしているスペースを削除したい(_残り文字ならび,_均等割長さ,_スペースを削除した文字列_2), append(_文字ならび_1,_スペースを削除した文字ならび_2,_スペースを削除した文字ならび). 均等割りにしているスペースを(_文字ならび,_均等割長さ,_文字ならび_1,_残り文字ならび) :- append(_文字ならび_1,_スペースならび,L3,_文字ならび), 要素のどれもスベースではない(_文字ならび_1), 要素の全てがスペースである(_スペースならび), 均等割(_文字ならび_1,_スペースならび,_均等割長さ). 均等割(_文字ならび_1,_スペースならび,_均等割長さ) :- length(_文字ならび_1,_均等割長さ), length(_スペースならび,_均等割長さ). 要素の全てがスペースである(L) :- forall(member(A,L),A = ' '). 要素のどれもスペースではない(L) :- forall(member(A,L),\+(A = ' ')). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # '一文字ずつスペースが入っている文字列のスペースを削除したい'(_文字列,_スペースを削除された文字列) :- atom_chars(_文字列,_文字ならび), '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(_文字ならび,_スペースを削除された文字ならび), atom_chars(_スペースを削除された文字列,_スペースを削除された文字ならび). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字],[_文字]) :- \+(_文字=' '). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字,' '|R1],[_文字|R2]) :- '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(R1,R2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- get_lines(Lines), '+0900を含まないものを検索したい'(Lines,_文字列). '+0900を含まないものを検索したい'(Lines,_文字列) :- member(_文字列,Lines), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/14 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # ミドルネームを含む名前も、ミドルネームを含まない名前も分解して抽出したい # また、名前の区切りはスペースやドットなど色々なものに対応したい # # ●対象データ # Edward Snowden # Edward.Joseph.Snowden # エドワード・スノーデン # エドワード=ジョセフ=スノーデン # # ●希望する結果 # (値を入れているわけではなく、$1〜$3に入っていて欲しいものです) # $1 = "Edward"   $2 = ""   $3 = "Snowden" # $1 = "Edward"   $2 = "Joseph"   $3 = "Snowden" # $1 = "エドワード"   $2 = ""   $3 = "スノーデン" # $1 = "エドワード"   $2 = "ジョセフ"   $3 = "スノーデン" # # 'ミドルネームを含む名前も、ミドルネームを含まない名前も分解して抽出したい また、名前の区切りはスペースやドットなど色々なものに対応したい'(_名前,_ファーストネーム,_ミドルネーム,_ラストネーム) :- split(_名前,[' ','.','=','・','='],L), 名前の分解(L,_ファーストネーム,_ミドルネーム,_ラストネーム). 名前の分解([_ファーストネーム,_ラストネーム],_ファーストネーム,'',_ラストネーム) :- !. 名前の分解([_ファーストネーム,_ミドルネーム,_ラストネーム],_ファーストネーム,_ミドルネーム,_ラストネーム). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/189 # ●Regular Expressionの使用環境 # ruby # # ●検索か置換か? # 置換 # # ●説明 # 行中の改行を削除したい # 以下でやると改行だけでなく改行の前の一文字も何故か消えてうまくいきません # 対象データの場合は「元」が消えてしまいます # # ruby -e 'puts open("input.txt").read.gsub(/[^。¥n]¥n/,"")' > output.txt # # ●対象データ # こんにちはお元 # 気ですか。 # 私は元気です。 # # ●希望する結果 # こんにちはお元気ですか。 # 私は元気です。 # # 文字列中の改行を削除したい(_文字列,_改行を削除された文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '\n')), _改行を削除された文字ならび), atomic_list_concat(_改行を削除された文字ならび,_改行を削除された文字列). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/263 # ●Regular Expressionの使用環境 # Javascript # # ●検索か置換か? # 置換 # # ●説明 # '1'を含まないABCからDEFまでを削除したいです # # ●対象データ # ABC # 1 # DEF # # ABC # 2 # DEF # # ABC # 3 # DEF # # ●希望する結果 # ABC # 1 # DEF # # '''1''を含まないABCからDEFまでを削除したいです'(_文字列,_希望する結果) :- atom_char(_文字列,_文字ならび), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L), atomic_list_concat(L,_希望する結果). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'([],[]). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(L3,L),!. '''1''を含まないABCからDEFまでを削除したいです'([A|R1],[A|R2]) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(R1,R2). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3) :- append(['A','B','C'|L2],['D','E','F'|L3],_文字ならび), \+(append(_,['A','B','C'|_],L2)), \+(append(_,['D','E','F'|_],L2)), \+(append(_,['1'|_],L2)),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/351 # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # Exampleの文字列を含まない行を削除したい # # ●対象データ # ABCA Test # BCAA Example # CABA Abc # # ●希望する結果 # BCAA Example # # # ネットで検索して出てきた^(?!.*Example).+$や^((?!Example).)*$ # で試したんですが空行が残ってしまいました # # 'Exampleの文字列を含まない行を削除したい'(_文字列,_Exampleの文字列を含まない行を削除された文字列) :- 改行記号付きの行ならびを得る(_文字列,_改行記号付きの行ならび), findall(_行,( member(_行,_文字列ならび), \+(sub_atom(_行,_,_,_,'Example'))), _Exampleの文字列を含まない行を削除された行ならび), atomic_list_concat(_Exampleの文字列を含まない行を削除された行ならび,_Exampleの文字列を含まない行を削除された文字列). 改行記号付きの行ならびを得る('',[]) :- !. 改行記号付きの行ならびを得る(_文字列,[_改行記号付き行|R]) :- 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列), 改行記号付きの行ならびを得る(_残り文字列,R). 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,_,R,_改行記号付き行), sub_atom(_文字列,_,R,0,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # ●Regular Expressionの使用環境 # # # ●検索か置換か? # 置換 # # ●説明 # 複数行の空行を1つの空行にしたい # # ●対象データ # # # # # # ●希望する結果 # 複数行の空行を1つの空行にしたい(_ファイル) :- get_chars(_ファイル,_文字ならび), 複数行の空行を1つの空行にしたい(_行ならび,_複数の空行を1つの空行にした文字ならび), put_chars(_ファイル,_複数の空行を1つの空行にした文字ならび). 複数行の空行を1つの空行にしたい([],[]). 複数行の空行を1つの空行にしたい(['\n','\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび) :- 複数行の空行を1つの空行にしたい(['\n'|_残り行ならび],_複数の空行を1つの空行にした行ならび),!. 複数行の空行を1つの空行にしたい([A|R1],[A|R2]) :- 複数行の空行を1つの空行にしたい(R1,R2),!. get_chars(_ファイル,_文字ならび) :- open(_ファイル,read,Instream), findall(_文字,( at_end_of_stream(Instream),!,fail; get_char(Instream,_文字))), _文字ならび), close(Instream). put_chars(_ファイル,_文字ならび) :- open(_ファイル,write,Outstream), append(_,[_文字|R],_文字ならび), putchar(Outstream,_文字), R = [], close(Outstream). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(Chars_1,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([],[]). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A,A,A,A|R1],[A,A,A|R2]) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R1_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1_1,R2),!. ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A|R1],[A|R2]) :- ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1,R2),!. ならびの先頭からの指定要素を読み飛ばす([],_,[]) :- !. ならびの先頭からの指定要素を読み飛ばす([A|R],B,[A|R]) :- \+(A = B),!. ならびの先頭からの指定要素を読み飛ばす([A|R1],A,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R2). % 以下のサイトは # ●Regular Expressionの使用環境 # サクラエディタ 2.1.1.1 # # ●検索か置換か? # 置換 # # ●説明 # []内の文字だけにしたい # ※ [ と ] と (半角スペース)の3つを消したい # # ●対象データ # [あいうえお] ←最後に半角スペースあり(以下同じ) # [カキクケコ] # [AIUEO] # [漢字等々] # # ●希望する結果 # あいうえお←最後の半角スペースも消したい(以下同じ) # カキクケコ # AIUEO # 漢字等々 '[]内の文字だけとしたい'(_文字列,_変換されたデータ) :- '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3), '[]内の文字だけにしたい'(S3,S3_2), atomic_list_concat([S1,S2_2,S3_2],_変換されたデータ),!. '[]内の文字だけとしたい'(_文字列,_文字列). '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3) :- sub_atom(_文字列,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,'['), sub_atom(S2,_,1,0,']'), '[]とスペースを削除する'(S2,S2_2),!. '[]とスペースを削除する'(S2,S2_2) :- '[]を削除する'(S2,S2_1), スペースを削除する(S2_1,S2_2). '[]を削除する'(S2,S2_1) :- sub_atom(S2,1,_,1,S2_2). スペースを削除する(S2_1,S2_2) :- findall(A,( スペースでない文字を取り出す(S2_1,A)), L), atom_chars(S2_2,L). スペースでない文字を取り出す(S2,A) :- sub_atom(S2,_,1,_,A), \+(A = ' ')). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(Chars_1,4,3,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素のm回以上の繰り返しをn回にしたい([],_,_,[]). ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(L1,_m,_n,L2) :- ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(L1,_m,_n,R1,L_n), ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(R1,_m,_n,R2_2), append(L_n,R2_2,L2),!. ならびの同じ文字要素のm回以上の繰り返しをn回にしたい([A|R1],_m,_n,[A|R2]) :- ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(R1,_m,_n,R2). ならびの同じ文字要素のm回以上の繰り返しをn回にしたい(R1,_m,_n,R1_2,L_n) :- length(L_m,_m), length(L_n,_n), all(L_m,A), all(L_n,A), append(L_m,R1_2,R1). % 以下のサイトは # # 先頭の連続した文字を一文字に置換した文字列 # 先頭の連続した文字を一文字に置換した文字列(_文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_先頭文字,_残り文字列],_置換した文字列),!. % 以下のサイトは # # 先頭の連続した文字を別の文字列に置換した文字列 # 先頭の連続した文字を別の文字列に置換した文字列(_文字列,_別の文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_別の文字列,_残り文字列],_置換した文字列),!. % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #468 # # ●Regular Expressionの使用環境 # sed、grep # ●検索か置換か? # 置換 # ●説明 # マッチした結果をそのまま置き換えるでなく、 # 1つ前に改行を入れたい。 # # ●対象データ # 0ABC1DEF2GHI3JKL4MNO # # ●希望する結果 # 0ABC # 1DEF # 2GHI # 3JKL # 4MNO # # よろしくお願いします。 置換規則('0','0'). 置換規則('1','1'). 置換規則('2','2'). 置換規則('3','3'). 置換規則('4','4'). 置換規則('5','5'). 置換規則('6','6'). 置換規則('7','7'). 置換規則('8','8'). 置換規則('9','9'). 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_置換された文字列) :- 検索文字列を置換する(_文字列,_前文字列,_置換文字列,_後文字列), 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列),!. 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_文字列). 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列) :- 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,'\n',_置換文字列,_置換された文字列_2],_置換された文字列). 検索文字列を置換する(_文字列,_前文字列,_置換文字列_1,_後文字列) :- 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列), 置換規則(_検索文字列,_置換文字列_1). 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 「留神-リュウジン-」いくす @ikuth ? 2 時間 # リスト[か,ど,か,わ,ど,わ,ん,ご]の部分集合を求めてこう # # subset([],[]). # subset([Head|Tail], [Head|L]) :- # subset(Tail,L). # subset([Head|Tail],L) :- # subset(Tail,L). # # ?- subset([か,ど,か,わ,ど,わ,ん,ご],L). # これで新しい会社名を決められるな! # # あー調子にのって書くんじゃなかったくっそ不安になってきたし間違ってたら恥ずかしいわwww # # 要は対象リストの先頭を取り出して、部分集合リストに入れるか入れないかことだし…でもこれだと「角ドワンゴ川」とかはつくれない # 会社名候補(_文字ならび,_会社名候補) :- subset(_文字ならび,_部分文字ならび), atomic_list_concat(_部分文字ならび,_会社名候補). subset([],[]). subset(L1,L) :- 置換候補(L1,L,Tail,L2), subset(Tail,L2). subset([Head|Tail],L) :- subset(Tail,L). 置換候補([か|R1],[カ|R2],R1,R2). 置換候補([ど|R1],[ド|R2],R1,R2). 置換候補([わ|R1],[ワ|R2],R1,R2). 置換候補([ど|R1],[ド|R2],R1,R2). 置換候補([ん|R1],[ン|R2],R1,R2). 置換候補([ご|R1],[ゴ|R2],R1,R2). 置換候補([か,ど|R1],[角|R2],R1,R2). 置換候補([か,わ|R1],[川|R2],R1,R2). 置換候補([A|R1],[A|R2],R1,R2). % % ?- 会社名候補([か,ど,か,わ,ど,わ,ん,ご],L). % L = カドカワドワンゴ ; % L = カドカワドワンご ; % L = カドカワドワン ; % L = カドカワドワんゴ ; % L = カドカワドワんご ; % L = カドカワドワん ; % L = カドカワドワゴ ; % L = カドカワドワご ; % L = カドカワドワ ; % ・・・・・ % ・・・・・ % L = 角カんゴ ; % L = 角カんご ; % L = 角カん ; % L = 角カゴ ; % L = 角カご ; % L = 角カ ; % L = 角川ドワンゴ ; % L = 角川ドワンご ; % L = 角川ドワン ; % L = 角川ドワんゴ ; % L = 角川ドワんご ; % ・・・・・ % ・・・・・ % % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #507 # ●Regular Expressionの使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # 行の一番最後の全角文字から後を削除したい。 # # ●対象データ # # 東京 abc 大阪静岡 123 名古屋 apple orange # # # ●希望する結果 # # 東京 abc 大阪静岡 123 名古屋 # # # 宜しくお願いします。 '行の一番最後の全角文字から後を削除したい。'(_行文字列,_行の一番最後の全角文字から後を削除した文字列) :- sub_atom(_行文字列,N,1,S,_), sub_atom(_行文字列,S,1,N,_文字), 全角文字(_文字), sub_atom(_行文字列,0,_,N,_行の一番最後の全角文字から後を削除した文字列),!. 全角文字(_全角文字) :- char_code(_全角文字,_文字コード), _文字コード > 255. % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #524 # # よろしくお願いします。 # # ●Regular Expressionの使用環境 # javascript # # ●検索か置換か? # 置換 # # ●説明 # {{ と }} で囲まれた文字を削除したい # 改行あり # # ●対象データ # {{ABCA # BCAA}} # CABA # {{ABCA}} # # ●希望する結果 # CABA '●検索か置換か? 置換 ●説明 {{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列). '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- '{{を切り出し、前文字列と後文字列に分解する'(_文字列,_前文字列,_後文字列), '}} まで文字列を削除したい 改行あり'(_後文字列,_二重括弧を削除した後文字列), atom_concat(_前文字列,_二重括弧を削除された後文字列,_二重括弧を削除された文字列),!. '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_文字列). '}} まで文字列を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- sub_atom(_文字列,S,2,R,'}}'), sub_atom(_文字列,_,R,0,_後文字列), '{{ と }} で囲まれた文字を削除したい 改行あり'(_残り文字列,_二重括弧を削除した後文字列),!. '}} まで文字列を削除したい 改行あり'(_文字列,_文字列). '{{を切り出し、前文字列と後文字列に分解する'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,'{{'), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典: Regular Expression(正規表現)Part12 #561 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # 前に指定したデータを含まない、「スケート」だけマッチさせたい # # # ●対象データ # アイススケート # ローラースケート # スケート # '前に指定したデータを含まない、「スケート」だけマッチさせたい'(_文,_前に指定したデータならび,_前データ,_検索データ,_後データ) :- sub_atom(_文,_前データ,スケート,_後データ), 前に指定したデータを含まない(S1,_指定したデータならび). 前に指定したデータを含まない(S1,_指定したデータならび) :- member(_指定したデータ,_指定したデータならび), sub_atom(S1,_,_,0,_指定したデータ),!, fail. 前に指定したデータを含まない(_,_). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # # member(A,[A|_]). # member(A,[_|R]) :- member(A,R). # この述語をスラスラと書けないとさすがにPrologプログラマとはいえない。さて、 # foo(L,A) :- member(A,L),評価(A). # 評価か通るかどうか? こんな場合に、 # # 評価(A) :- の中で member(A,L) でAを取り出した後の要素、つまりまだ取り出していない要素のリストを知りたいとする。これは # member(A,[A|R],R). # member(A,[_|R1],R) :- member(A,R1,R). # で解決 。 # # # このように定義を変えた上で、 # foo(L,A) :- meber(A,L,R),評価(A,R). # として、評価/2の中でRを参照すればよい。 # # # さて、次は、まだ参照していない要素だけでなく、既に参照して評価してしまった要素も参照したいならどうするか。 # member([],A,[A|R],R). # member([B|R1],A,[B|R2],R) :- member(R1,A,R2,R). # これでどうか? # # 先ほどの member/4 の定義は一般に使われているものと引数順序が違うかも知れない。実は # ?- member(L1,A,L2,[a,b,c]). # は # ?- append(L1,[A|L2],[a,b,c]). # と同じことである。 # これを書きたくて書いてきた。 # # # これが同じ? # # member([],A,[A|E],E). # member([B|C],A,[B|D],E) :- member(C,A,D,E). # # append([],A,A). # append([A|B],C,[A|D]) :- append(B,C,D). # 1) 午前中に書いたPrologのmember/2でまだ参照していない残りリストを 得るmember/3を定義。残りのリスト R の位置を中に入れた。 member(A,R,[A|R]). member(A,R,[_|R3]) :- member(A,R,L3). 2) さらに 既に参照済みのリストも得られる member/4 を定義。 member([],A,R,[A|R]). member([B|L1],A,R,[B|L3]) :- member(L1,A,R,L3). これはPrologの代表述語append/3とよく似ている。 3) 第二引数 A と第三引数 R を [A|R] と纏める。 member([],[A|R],[A|R]). member([B|L1],[A|R],[B|L3]) :- member(L1,[A|R],L3). 4) 第一節の[A|R] を L に 第二節の[A|R] を L2 に置換すると member([],L,L). member([B|L1],L2,[B|L3]) :- member(L1,L2,L3). 5) 述語名をappendに置き換えてみる。 append([],L,L). append([B|L1],L2,[B|L3]) :- append(L1,L2,L3). という例の定義になる。member/2 に後方参照、前方参照を付加したものを変形すれば、である。 % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #723 # # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか # '例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか'(_文字列,_置換された文字列) :- findall(_文字,文字列中の文字を可能ならば異体字に変換する(_文字列,_文字),L), atomic_list_concat(L,_置換された文字列). 文字列中の文字を可能ならば異体字に変換する(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字_1), 異体字変換(_文字_1,_文字). 異体字変換(_文字_1,_文字_2) :- 異体字(_文字_1,_文字_2),!. 異体字変換(_文字,_文字). % 以下のサイトは # phpの文字置換で質問です # # 【目的】 文字列内の ab を a にする ただしabの後ろがcの場合を除く # 例 ab123 → a123 、 abcde → abcde # # という条件を正規表現で記述するにはどのように書けばよいでしょうか? # # よろしくおねがいします '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_置換された文字列) :- '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列), '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,a,_置換された文字列_2],_置換された文字列),!. '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_文字列). '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列) :- '文字列内のab'(_文字列,_前文字列,_後文字列), 'ただしabの後ろがcの場合を除く'(_後文字列). '文字列内のab'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,ab), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'ただしabの後ろがcの場合を除く'(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,c)). % 以下のサイトは p :- 終了条件. p :- q1,p. p :- q2,p. は既に、読み易いとはいえない。それで、 p :- 終了条件. p :- r. と置換して、 r :- r1. r :- r2. r1 :- q1,p. r2 :- q2,p. のように分解する。ここまでして、 r r1 r2 に適切な述語名を与えれば良いということになる。 例えば、r は'r1かr2を施した上でp'と述べる。これが述語名だ。 p :- 終了条件. p :- r1かr2を施した上でP. となる。 r1 は 'q1でp' r2 は 'q2でp' などが考えられる。可能な最善の言い回しを捜す。 さらにできることなら '施した上でp' は述べたくない。 それぞれに適切な述語名を与えることができたとしての話だが、 r1 r2 を読むことによって、 :- q1,p. と :- q2,p. を読まなくても、 完全に理解できたと思わせることが可能なr1,r2を見つければよい。 再帰のpはこの表現の中に吸収させる。 最後に付いている『再帰のp』をどのような言葉で暗示的に述べるか。 この話は、最終的にそれが問われる、という事となる。 % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ'(X) :- '9―3÷1/3+1=?'(X), 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?'(X) :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式,[]), X is _式. ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式 = ?,[]), X is _式, '?を全角数字の解に置換して表示する'('9―3÷1/3+1=%t\n',X). ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). ここだけの文字置換('=','='). ここだけの文字置換('?',' ? '). ここだけの文字置換('2','2'). ここだけの文字置換('4','4'). ここだけの文字置換('5','5'). ここだけの文字置換('6','6'). ここだけの文字置換('7','7'). ここだけの文字置換('8','8'). ここだけの文字置換('0','0'). '?を全角数字の解に置換して表示する'(_表示パターン,X) :- '?を全角数字の解に置換して'(X,_解文字列), writef(_表示パターン,[_解文字列]). '?を全角数字の解に置換して'(X,_解文字列) :- number_chars(X,Chars), findall(_全角数字,( member(_数字,Chars), ここだけの文字置換(_全角数字,_数字)),_解文字ならび), atomic_list_concat(_解文字ならび,_解文字列). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ # '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列), '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする', 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな), 式を復元して表示する('9―3÷1/3+1=',_はてな). '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列) :- 'ここだけの文字列置換(=?は除去される)'('9―3÷1/3+1=?',_置換された半角式文字列). '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする' :- op(401,yfx,(/)). 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな) :- read_term_from_atom(_置換された半角式文字列,_式,[]), _はてな is _式. 'ここだけの文字列置換(=?は除去される)'(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの置換('9','9'). ここだけの置換('―','-'). ここだけの置換('3','3'). ここだけの置換('÷','/'). ここだけの置換('/',' rdiv '). ここだけの置換('+','+'). ここだけの置換('1','1'). ここだけの置換('=',''). ここだけの置換('?',''). ここだけの置換('2','2'). ここだけの置換('4','4'). ここだけの置換('5','5'). ここだけの置換('6','6'). ここだけの置換('7','7'). ここだけの置換('8','8'). ここだけの置換('0','0'). 式を復元して表示する(_表示文字列_1,_はてな) :- '_はてなを全角数字に置換する'(_はてな,_はてな全角文字列), writef('%t%t\n',[_表示文字列_1,_はてな全角文字列]). '_はてなを全角数字に置換する'(_はてな,_はてな全角数字文字列) :- number_chars(_はてな,_はてな数字ならび), 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび), atomic_list_concat(_はてな全角数字ならび,_はてな全角数字文字列). 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび) :- findall(_全角数字,( member(_半角数字,_はてな数字ならび), ここだけの置換(_全角数字,_半角数字)),_はてな全角数字ならび). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1387257592/898 # ●Regular Expressionの使用環境 # 2ちゃんねる専ブラ「JaneView」 または 「php」 # # ●検索か置換か? # 検索 # # ●説明 # ・「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と「春」または「冬」の文字が入った文章を検出したい。 # ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。 # #   ((春|冬).*(季節|まだ寒い|もうすぐ|今は|もうすぐ)|(季節|まだ寒い|もうすぐ|今は|もうすぐ).*(春|冬)) # ということがしたいのですが短くなりませんか? # # 同じ単語がそれぞれ2つずつ必要だと正規表現が長くなりがちなので (季節|まだ寒い|もうすぐ|今は|もうすぐ) # は1回で済ませるのが希望です。 # #   (春|冬(注:後ろあれば不要))(季節|まだ寒い|もうすぐ|今は|もうすぐ)(春|冬(注:前にあれば不要)) # ↑こんな感じが希望です # # ●対象データ ●希望する結果 # 1 まもなく「季節」は「春」ですね   結果:検出 (季節 & 春) # 2 「春」はよい「季節」ですね     結果:検出 (春 & もうすぐ) # 3 「春」よこい             結果:非検出 # # '・「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と「春」または「冬」の文字が入った文章を検出したい。 ・「春」または「冬」という文字は「季節」「まだ寒い」「今は」「もうすぐ」という文字列の前にあっても後ろにあっても良い。'(_文字列) :- '「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と'(_文字列), '「春」または「冬」の文字が入った文章を'(_文字列), 検出したい. '「季節」「まだ寒い」「もうすぐ」「今は」「もうすぐ」のいずれかの文字列と'(_文字列) :- sub_atom(_文字列,_,_,_,_副文字列_1), member(_副文字列_1,[季節,まだ寒い,もうすぐ,今は,もうすぐ]). '「春」または「冬」の文字が入った文章を'(_文字列) :- sub_atom(_文字列,_,_,_,_副文字列_2), member(_副文字列_2,[春,冬]). 検出したい. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは :- op(470,xfx,(#)). :- op(700,xfx,は). :- op(710,xfx,(::)). A は B :- A is B. 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列) :- \+('行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列)), '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列),!. '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列) :- member(L,_ガウス行列), 最終要素が0でなく(L), それ以外は0である(L),!. 最終要素が0でなく(L) :- append(L1,[N],L), \+(N = 0),!. それ以外は0(L) :- append(L1,[_],L), all(L1,0),!. % *** user: 'ガウス行列' / 2 *** 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . % *** user: 'ガウス行列' / 1 *** 'ガウス行列'(_行列) :- 'ガウス行列'([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[-1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0, !, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0, !, '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X), ! . % *** user: 'ガウス行列に変形' / 5 *** 'ガウス行列に変形'(N,Len,X,X,[]) :- N >= Len, ! . 'ガウス行列に変形'(N,Len,_行列1,X,UL) :- nth1(N,_行列1,_行), nth1(N,_行,A), M is N + 1, 'ガウス行列に変形'(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, 'ガウス行列に変形'(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL) . % *** user: 'ガウス行列に変形' / 4 *** 'ガウス行列に変形'(N,Len,X,X) :- N >= Len, ! . 'ガウス行列に変形'(N,Len,_行列1,X) :- nth1(N,_行列1,_行), nth1(N,_行,A), M is N + 1, 'ガウス行列に変形'(N,M,Len,A,_行列1,_行列2), N2 is N + 1, 'ガウス行列に変形'(N2,Len,_行列2,X) . % *** user: 'ガウス行列に変形' / 3 *** 'ガウス行列に変形'(_行列,_ガウス行列,UL) :- length(_行列,Len), 'ガウス行列に変形'(1,Len,_行列,_ガウス行列,UL) . % *** user: 'ガウス行列に変形' / 2 *** 'ガウス行列に変形'(_行列,_ガウス行列) :- length(_行列,Len), 'ガウス行列に変形'(1,Len,_行列,_ガウス行列) . % *** user: '既約ガウス行列に変形の二' / 4 *** '既約ガウス行列に変形の二'(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len, ! . '既約ガウス行列に変形の二'(N,Len,G,_既約ガウス行列) :- nth1(N,G,_行), nth1(N,_行,A), '行基本変形'(1 / A # N,G,G1), N2 is N + 1, '既約ガウス行列に変形の二'(N2,Len,G1,_既約ガウス行列) . % *** user: '既約ガウス行列の一' / 2 *** '既約ガウス行列の一'(_,[]) :- ! . '既約ガウス行列の一'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列の一'([0|P1],R) . % *** user: '既約ガウス行列の一' / 1 *** '既約ガウス行列の一'([_行]) :- '零以外の最初の要素が1'(_行), ! . '既約ガウス行列の一'([_行|R]) :- '零以外の最初の要素が1'(_行), '既約ガウス行列の一'(R) . % *** user: '既約ガウス行列' / 2 *** '既約ガウス行列'(_,[]) :- ! . '既約ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列'([0|P1],R) . % *** user: '既約ガウス行列' / 1 *** '既約ガウス行列'(_行列) :- '既約ガウス行列の一'([],_行列), '行列の転置'(_行列,_転置された行列), '既約ガウス行列検査'(_転置された行列) . % *** user: '既約ガウス行列検査' / 1 *** '既約ガウス行列検査'([]) :- ! . '既約ガウス行列検査'([L|R]) :- append(L1,[1|L2],L), append(L1,L2,L3), 'すべての要素'(L3,0), '既約ガウス行列検査'(R), ! . '既約ガウス行列検査'([L|R]) :- \+(append(L1,[1|L2],L)), '既約ガウス行列検査'(R) . % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- ! . '既約ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N - 1, '既約ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列) . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列) . % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- ! . '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- nth1(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, nth1(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列), ! . % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_行列,_既約ガウス行列) :- \+('ガウス行列'(_行列)), 'ガウス行列に変形'(_行列,_ガウス行列), '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列), ! . '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列) . % *** user: 'n次正方行列の要素を行・列順序で取り出す' / 5 *** 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列の要素を列・行順序で取り出す' / 5 *** 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。' / 5 *** 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), '行列式の値'(_n_1次正方行列,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. % *** user: 'i,jから乗数を得る' / 3 *** 'i,jから乗数を得る'(_i,_j,-1) :- 1 is (_i + _j) mod 2, ! . 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2, ! . % *** user: '第何行を取り除く' / 3 *** '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列) . % *** user: '正方行列から第i行と第j列を取り除く' / 4 *** '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), '転置'(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), '転置'(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列) . % *** user: '正方行列の対角要素' / 2 *** '正方行列の対角要素'(_正方行列,_対角要素) :- findall(A,(append(L0,[L|_],_正方行列) , \+(L = []) , length(L0,N2) , length(L1,N2) , append(L1,[A|_],L)),_対角要素) . % *** user: '正方行列' / 3 *** '正方行列'(N,_次数,[]) :- N > _次数, ! . '正方行列'(N,_次数,[_行|R]) :- length(_行,_次数), N2 is N + 1, '正方行列'(N2,_次数,R) . % *** user: '正方行列' / 2 *** '正方行列'(_,[]) :- ! . '正方行列'(_行数,[_行|R]) :- length(_行,_行数), '正方行列'(_行数,R) . % *** user: '正方行列' / 1 *** '正方行列'(_正方行列) :- length(_正方行列,_行数), '正方行列'(1,_行数,_正方行列) . % *** user: '正方行列の行列式' / 2 *** '正方行列の行列式'(_正方行列,_行列式) :- findsum(_符号付き要素積,'行列の符号付き要素積'(_正方行列,_符号付き要素積),_行列式) . % *** user: '正方行列の行列式の値' / 2 *** '正方行列の行列式の値'(_正方行列,_行列式の値) :- 'ガウス行列に変形'(_正方行列,X,Y), '行列式|C|の値'(X,Z1), 'ならびの積'(Y,Z2), _行列式の値 is Z1 // Z2 . % *** user: '正方行列の逆行列' / 3 *** '正方行列の逆行列'(_n次,_正方行列,_逆行列) :- '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '正方行列の逆行列' / 2 *** '正方行列の逆行列'(_正方行列,_逆行列) :- length(_正方行列,_n次), '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '単位行列' / 4 *** '単位行列'(M,N1,N,[]) :- N1 > N, ! . '単位行列'(M,M,N,[1|R]) :- N2 is M + 1, '単位行列'(M,N2,N,R) . '単位行列'(M,N1,N,[0|R]) :- \+(N1 = M), N2 is N1 + 1, '単位行列'(M,N2,N,R) . % *** user: '単位行列' / 3 *** '単位行列'(M,N,[]) :- M > N, ! . '単位行列'(M,N,[_行|R]) :- '単位行列'(M,1,N,_行), M2 is M + 1, '単位行列'(M2,N,R) . % *** user: '単位行列' / 2 *** '単位行列'(N,_単位行列) :- '単位行列'(1,N,_単位行列) . % *** user: '単位行列' / 1 *** '単位行列'(_単位行列) :- '正方行列'(_単位行列), length(_単位行列,_次数), '単位行列'(_次数,_単位行列) . % *** user: '単位行列の生成' / 2 *** '単位行列の生成'(N,LL) :- length(L,N), findall(L,(append(L0,[1|R],L) , all(L0,0) , all(R,0)),LL), ! . % *** user: '行列式の値' / 4 *** '行列式の値'(_正方行列,_i,_n,_行列式の値) :- findsum(W,('n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素) , '余因子'(_n,_正方行列,_i,_j,_余因子) , W is _正方行列の要素 * _余因子),_行列式の値) . % *** user: '行列式の値' / 2 *** '行列式の値'([[A,B],[C,D]],_行列式の値) :- _行列式の値 is A * D - B * C, ! . '行列式の値'(_正方行列,_行列式の値) :- _正方行列 = [_行_1|R], length([_行_1|R],_i), length(_行_1,_n), '行列式の値'(_正方行列,_i,_n,_行列式の値) . % *** user: '行列のすべての要素に値を掛ける' / 5 *** '行列のすべての要素に値を掛ける'(_行目,_n,LL,_,LL) :- _行目 > _n, ! . '行列のすべての要素に値を掛ける'(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, '行列のすべての要素に値を掛ける'(_行目_2,_n,LL3,_乗数 / _除数,LL2) . % *** user: '行列の掛算_2' / 3 *** '行列の掛算_2'(_,[],[]) :- ! . '行列の掛算_2'(A,[B|R2],[C|R3]) :- '行列の掛算_3'(A,B,C), '行列の掛算_2'(A,R2,R3) . % *** user: '行列要素' / 4 *** '行列要素'(_行,_列,_行列,_値) :- nth1(_行,_行列,L), nth1(_列,L,_値) . % *** user: '行列の列置換' / 4 *** '行列の列置換'(_列,_置換する列,_対象行列,_置換された行列) :- '行列の転置'(_対象行列,_転置された行列), '要素番号によるならびの置換'(_列,_置換する列,_転置された行列,_置換された行列の二), '行列の転置'(_置換された行列の二,_置換された行列) . % *** user: '行列の行置換' / 4 *** '行列の行置換'(_行,_置換する行,_対象行列,_置換された行列) :- '要素番号によるならびの置換'(_行,_置換する行,_対象行列,_置換された行列), ! . % *** user: '行列の要素積の符号を判断する' / 3 *** '行列の要素積の符号を判断する'(_順列,_符号付き要素積,_符号付き要素積) :- '偶順列'(_順列), ! . '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) :- '奇順列'(_順列), _符号付き要素積 is _要素積の一 * -1, ! . % *** user: '行列の符号付き要素積' / 2 *** '行列の符号付き要素積'(_正方行列,_符号付き要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積の一), '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) . % *** user: '行列から列を選択する' / 3 *** '行列から列を選択する'(_,[],[]) :- ! . '行列から列を選択する'(_選択する列位置ならび,[_行|R1],[L|R2]) :- '列の選択'(_選択する列位置ならび,_行,L), '行列から列を選択する'(_選択する列位置ならび,R1,R2) . % *** user: '行列行置換' / 5 *** '行列行置換'(N,N,L,[_|R],[L|R]) :- ! . '行列行置換'(M,N,L,[A|R1],[A|R2]) :- M2 is M + 1, '行列行置換'(M2,N,L,R1,R2) . % *** user: '行列の結合' / 5 *** '行列の結合'(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2) . '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), '行列の結合'(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2) . % *** user: '行列の結合' / 3 *** '行列の結合'([_行1|R1],[_行2|R2],_結合された行列) :- '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0 . % *** user: '行列の置換' / 5 *** '行列の置換'(_列,_行,_置換要素,_対象行列,_置換された行列) :- n_th(_行,_対象行列,_対象行), '要素番号によるならびの置換'(_列,_置換要素,_対象行,_置換された行), '要素番号によるならびの置換'(_行,_置換された行,_対象行列,_置換された行列), ! . % *** user: '行列の転置' / 2 *** '行列の転置'(_行列,_転置された行列) :- 転置(_行列,_転置された行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % *** user: m_trans / 3 *** m_trans([],[],[]) :- ! . m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) . % *** user: m_trans / 2 *** m_trans([[]|_],[]) :- ! . m_trans(L,[B|R1]) :- m_trans(L,B,R2), m_trans(R2,R1), ! . % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , nth1(N,_行列,_行) , nth1(N,_行,U)),L), 'ならびの積'(L,_値) . % *** user: '行列の階数' / 2 *** '行列の階数'(_行列,_階数) :- 'ガウス行列に変形'(_行列,_ガウス行列), count((member(L,_ガウス行列) , \+('すべての要素が0か0.0'(L))),_階数) . % *** user: '行列の要素積' / 2 *** '行列の要素積'(_正方行列,_要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積) . % *** user: '行列の掛算' / 3 *** '行列の掛算'(L1,L2,X) :- '転置'(L2,L4), '行列の掛算_1'(L1,L4,X) . % *** user: '行列の掛算_1' / 3 *** '行列の掛算_1'([],_,[]) :- ! . '行列の掛算_1'([A|R1],L,[S1|R3]) :- '行列の掛算_2'(A,L,S1), '行列の掛算_1'(R1,L,R3) . % *** user: '行列の掛算_3' / 3 *** '行列の掛算_3'([],[],0) :- ! . '行列の掛算_3'([A|R1],[B|R2],S) :- '分数を含む掛算'(A,B,S1), '行列の掛算_3'(R1,R2,S2), '分数を含む加算'(S1,S2,S), ! . % *** user: '行列の行の先頭からn列を切り取った残り行列' / 3 *** '行列の行の先頭からn列を切り取った残り行列'(_n列,LL1,LL2) :- length(L0,_n列), findall(L2,(member(L1,LL1) , append(L0,L2,L1)),LL2) . % *** user: '行基本変形' / 6 *** '行基本変形'(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . '行基本変形'(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, '行基本変形'(*,_乗数,M2,_行目,R1,R2) . % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X), ! . '行基本変形'([],_行列,[]) :- ! . '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2), ! . '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, '分数を含む乗算'(_乗数1,-1,_乗数3), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, '分数を含む乗算'(_乗数2,-1,_乗数3), !, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , '分数を含む乗算'(A,_乗数1,U)),_乗算された行1), findall(W,(member(B,_行2) , '分数を含む乗算'(B,_乗数2,W)),_乗算された行2), '項加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,U)),_乗算された行), '項加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_乗数,_乗数2), '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_除数,_除数2), '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(Y,(member(A,_行1) , '行基本変形除算'(A,_乗数,_除数,Y)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . % *** user: '行基本変形2' / 3 *** '行基本変形2'(_乗数 # _行目,_行列,X) :- nth1(_行目,_行列,_行), findall(U,(member(A,_行) , U is A * _乗数),_乗算された行), replace_nth(1,_行目,_乗算された行,_行列,X), ! . % *** user: '行基本変形3の適用' / 7 *** '行基本変形3の適用'(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 6 *** '行基本変形3の適用'(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 5 *** '行基本変形3の適用'(A,B,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 4 *** '行基本変形3の適用'(A,B,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形除算' / 4 *** '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数, ! . '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), '約分'(A2 / _除数,X), ! . '行基本変形除算'(A,_乗数,_除数,X) :- X is A * _乗数 / _除数 . '分数を含む掛算'(A,B,C) :- '分数を含む乗算'(A,B,C). % *** user: '分数を含む乗算' / 3 *** '分数を含む乗算'(A1 / B1,A2 / B2,C) :- B3 is B1 * B2, A3 is A1 * A2, '約分'(A3 / B3,C), ! . '分数を含む乗算'(V,A2 / B2,C) :- number(V), A3 is V * A2, '約分'(U / B2,C), ! . '分数を含む乗算'(A1 / B1,V,C) :- number(V), A3 is A1 * V, '約分'(A3 / B1,C), ! . '分数を含む乗算'(A,B,C) :- C is A * B . % *** user: '分数を含む掛算' / 3 *** '分数を含む掛算'(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, '約分'(S1 / S2,C), ! . '分数を含む掛算'(A1 / A2,B,C) :- S1 is A1 * B, '約分'(S1 / A2,C), ! . '分数を含む掛算'(A,B1 / B2,C) :- S1 is B1 * A, '約分'(S1 / B2,C), ! . '分数を含む掛算'(A,B,C) :- C is A * B . % *** user: '分数を含む加算' / 3 *** '分数を含む加算'(A,B,C) :- number(A), number(B), C is A + B, ! . '分数を含む加算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 + A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む加算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 + A2, '約分'(C3 / B1,C), ! . '分数を含む加算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 + A2, '約分'(C3 / B2,C), ! . % *** user: '分数公倍数' / 3 *** '分数公倍数'(A1 / A2,B1 / B2,C1 / C2) :- C1 is A1 * B1, C2 is A2 * B2, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- integer(A), C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- integer(B), C1 is A1 * B, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- A float, C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- B float, C1 is A1 * B, ! . % *** user: '分数を含む減算' / 3 *** '分数を含む減算'(A,B,C) :- number(A), number(B), C is A - B, ! . '分数を含む減算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 - A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む減算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 - A2, '約分'(C3 / B1,C), ! . '分数を含む減算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 - A2, '約分'(C3 / B2,C), ! . % *** user: '分数を含む除算' / 3 *** '分数を含む除算'(A,B,C) :- number(A), number(B), '約分'(A / B,C), ! . '分数を含む除算'(A1 / B1,A2 / B2,C) :- '分数を含む乗算'(A1 / B1,B2 / A2,C), ! . '分数を含む除算'(V,A2 / B2,C) :- number(V), '分数を含む乗算'(V,B2 / A2,C), ! . '分数を含む除算'(A1 / B1,V,C) :- number(V), B2 is V * B1, '約分'(A1 / B2,C), ! . % *** user: '最小公倍数' / 3 *** '最小公倍数'(N1 * A,B,C) :- integer(B), '最小公倍数'(A,B,C), N1 is C // A, ! . '最小公倍数'(A,N2 * B,C) :- integer(A), '最小公倍数'(A,B,C), N2 is C // B, ! . '最小公倍数'(N1 * A,N2 * B,C) :- '最小公倍数'(A,B,C), N1 is C // A, N2 is C // B, ! . '最小公倍数'(A,B,X) :- integer(A), integer(B), '最大公約数をユークリッドの互除法で求める'(A,B,C), X is A * B // C . % *** user: '最小公倍数' / 2 *** '最小公倍数'([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), '最小公倍数'(L1,X), '最小公倍数_2'([N1 * A|R],X), ! . '最小公倍数'([A,B],X) :- '最小公倍数'(A,B,X), ! . '最小公倍数'([A|R],X) :- '最小公倍数'(R,B), '最小公倍数'(A,B,X), ! . % *** user: '最小公倍数_2' / 2 *** '最小公倍数_2'([],_) :- ! . '最小公倍数_2'([N * A|R],Y) :- N is Y // A, '最小公倍数_2'(R,Y), ! . '最小公倍数_2'([A|R],Y) :- integer(A), '最小公倍数_2'(R,Y), ! . % *** user: '最大公約数をユークリッドの互除法で求める' / 3 *** '最大公約数をユークリッドの互除法で求める'(M,N,N) :- 0 is M mod N, ! . '最大公約数をユークリッドの互除法で求める'(M,N,X) :- Mod is M mod N, '最大公約数をユークリッドの互除法で求める'(N,Mod,X) . % *** user: '最大公約数' / 3 *** '最大公約数'(M,N,X) :- '最大公約数をユークリッドの互除法で求める'(M,N,X), ! . % *** user: '要素数はnの倍数' / 2 *** '要素数はnの倍数'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素を削除するのニ' / 3 *** '要素を削除するのニ'(A,[],[]) :- ! . '要素を削除するのニ'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除するのニ'(A,[B|R1],[B|R2]) :- '要素を削除するのニ'(A,R1,R2) . % *** user: '要素を削除する' / 3 *** '要素を削除する'(_,[],_) :- !, fail . '要素を削除する'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除する'(A,[B|R1],[B|R2]) :- '要素を削除する'(A,R1,R2) . % *** user: '要素がn個' / 3 *** '要素がn個'(A,L,_n) :- findall(_,append(_,[A|_],L),L1), length(L1,_n), ! . % *** user: '要素数をnで割ると余りがmを収集' / 4 *** '要素数をnで割ると余りがmを収集'(L,_n,_m,Lx) :- findall(A,(append(L0,[A|R],L) , '要素数をnで割ると余りがm'([_|L0],_n,_m)),Lx) . % *** user: '要素数がnで割り切れる' / 2 *** '要素数がnで割り切れる'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素数が奇数' / 1 *** '要素数が奇数'(L) :- length(L,N), 1 is N mod 2 . % *** user: '要素位置は' / 2 *** '要素位置は'(L0,_要素位置) :- length([_|L0],_要素位置) . % *** user: '要素がゼロ以外に出会うまで' / 3 *** '要素がゼロ以外に出会うまで'([A|R],[],[A|R]) :- \+((A = 0 ; A = 0.0e+00)), ! . '要素がゼロ以外に出会うまで'([0|R],[0|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . '要素がゼロ以外に出会うまで'([0.0e+00|R],[0.0e+00|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . % *** user: '要素' / 2 *** '要素'(A,B) :- member(A,B) . % *** user: '要素番号によるならびの置換' / 4 *** '要素番号によるならびの置換'(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび), ! . % *** user: '要素の複製' / 3 *** '要素の複製'(_複製数,_要素,_複製ならび) :- findall(_要素,for(1,N,_複製数),_複製ならび) . % *** user: '要素数' / 2 *** '要素数'(_ならび,_要素数) :- 'ならび'(_ならび), list_length(_ならび,_要素数) . % *** user: '要素数が偶数' / 1 *** '要素数が偶数'(L) :- length(L,N), 0 is N mod 2 . % *** user: '要素数をnで割ると余りがm' / 3 *** '要素数をnで割ると余りがm'(L,_n,_m) :- length(L,Len), _m is Len mod _n . % *** user: '要素数割り算' / 5 *** '要素数割り算'(L1,L2,Div,Div,L1) :- append([_|_],L1,L2), ! . '要素数割り算'(L1,L2,L4,Div,Mod) :- append(L2,L3,L1), length(L2,Len), length(L5,Len), '要素数割り算'(L3,L5,[_|L4],Div,Mod) . % *** user: '要素数割り算' / 4 *** '要素数割り算'(L1,L2,Div,Mod) :- length(L1,Len1), length(L2,Len2), length(L11,Len1), length(L22,Len2), '要素数割り算'(L11,L22,[],Div,Mod) . % *** user: '行の整列' / 5 *** '行の整列'(_,_,_,[],[]) :- ! . '行の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . '行の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . % *** user: '行の整列' / 4 *** '行の整列'(_行目から,_行目まで,_表,_整列した表) :- '行の整列'(1,_行目から,_行目まで,_表,_整列した表), ! . % *** user: '行の整列' / 2 *** '行の整列'(_表,_整列した表) :- list_length(_表,E), '行の整列'(1,1,E,_表,_整列した表), ! . % *** user: '行の反転' / 5 *** '行の反転'(_,_,_,[],[]) :- ! . '行の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . '行の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . % *** user: '行の反転' / 4 *** '行の反転'(_行目から,_行目まで,_表,_反転した表) :- '行の反転'(1,_行目から,_行目まで,_表,_反転した表), ! . % *** user: '行の反転' / 2 *** '行の反転'(_表,_反転した表) :- list_length(_表,E), '行の反転'(1,1,E,_表,_反転した表), ! . % *** user: '行の置換' / 4 *** '行の置換'(_行番号1,_行番号2,_行列,_置換された行列) :- nth1(_行番号1,_行列,_行1), nth1(_行番号2,_行列,_行2), '要素番号によるならびの置換'(_行番号2,_行1,_行列,_行列2), '要素番号によるならびの置換'(_行番号1,_行2,_行列2,_置換された行列), ! . % *** user: 'すべての要素が0か0.0' / 1 *** 'すべての要素が0か0.0'([]). 'すべての要素が0か0.0'([0|R]) :- 'すべての要素が0か0.0'(R) . 'すべての要素が0か0.0'([0.0e+00|R]) :- 'すべての要素が0か0.0'(R) . % *** user: 'すべての要素' / 2 *** 'すべての要素'([A],A). 'すべての要素'([A|R],A) :- 'すべての要素'(R,A) . % *** user: 'すべての要素が変数である' / 1 *** 'すべての要素が変数である'([V]) :- var(V), ! . 'すべての要素が変数である'([V|R]) :- var(V), 'すべての要素が変数である'(R) . % *** user: 'すべての要素を左右反転する' / 2 *** 'すべての要素を左右反転する'([],[]) :- ! . 'すべての要素を左右反転する'([L1|R1],[L2|R2]) :- reverse(L1,L2), 'すべての要素を左右反転する'(R1,R2) . % *** user: '最初に現れる0ではない要素・位置' / 4 *** '最初に現れる0ではない要素・位置'(Nth,[X|_],Nth,X) :- \+((X = 0 ; X = 0.0e+00)), ! . '最初に現れる0ではない要素・位置'(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . '最初に現れる0ではない要素・位置'(Mth,[0.0e+00|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . % *** user: replace_nth / 5 *** replace_nth(_,_,_,[],[]) :- ! . replace_nth(S,S,Y,[_|R1],[Y|R2]) :- S2 is S + 1, replace_nth(S2,S,Y,R1,R2), ! . replace_nth(S,N,Y,[A|R1],[A|R2]) :- S2 is S + 1, replace_nth(S2,N,Y,R1,R2) . % *** user: '余因子' / 5 *** '余因子'(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) . % *** user: '余因子行列の要素が余因子である' / 4 *** '余因子行列の要素が余因子である'(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,(nth1(_j,L,_余因子) , '余因子'(_n,_正方行列,_i,_j,_余因子)),L) . % *** user: '余因子行列' / 3 *** '余因子行列'(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,(nth1(_i,_余因子行列,L) , '余因子行列の要素が余因子である'(_n,_正方行列,_i,L)),_余因子行列) . % *** user: '余因子行列で行列値|a|を求める' / 2 *** '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- '余因子行列'(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値) . % *** user: '余因子行列を使って逆行列を得る' / 3 *** '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), '余因子行列'(_n,_正方行列,_余因子行列), '転置'(_余因子行列,_転置された余因子行列), '行列のすべての要素に値を掛ける'(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列) . % *** user: 'とからりすと' / 2 *** 'とからりすと'(A,[A]) :- atomic(A), ! . 'とからりすと'(A 'と' B,C) :- 'とからりすと'(A,A1), 'とからりすと'(B,B1), append(A1,B1,C) . % *** user: '項加算_1' / 3 *** '項加算_1'([],S,S) :- ! . '項加算_1'([A|R],Y,S) :- 'ならび'(A), 'ならび'(Y), !, 'ならび項加算'(A,Y,Z), '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), '項加算_1'(R,Y,S), ! . '項加算_1'([A|R],Y,S) :- '分数を含む加算'(A,Y,Z), '項加算_1'(R,Z,S) . '項加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '項加算_1'(L,Y,S) . % *** user: '項加算_2' / 2 *** '項加算_2'([],[]) :- ! . '項加算_2'([L|R],[S|R2]) :- '項加算'(L,S), '項加算_2'(R,R2) . % *** user: '項加算' / 2 *** '項加算'(trunc(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL), ! . '項加算'('四捨五入'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), ! . '項加算'('切捨て'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), ! . '項加算'('切り上げ'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), ! . '項加算'([],L) :- var(L), L = 0, ! . '項加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '項加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '項加算_2'(L1,SL), ! . '項加算'(X,S) :- '項加算_1'(X,0,S) . % *** user: '加算' / 2 *** '加算'(truncate(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A is truncate(B)),SL), ! . '加算'('四捨五入'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), ! . '加算'('切捨て'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), ! . '加算'('切り上げ'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), ! . '加算'([],L) :- var(L), L = 0, ! . '加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '加算_2'(L1,SL), ! . '加算'(X,S) :- '加算_1'(X,0,S) . % *** user: '加算_1' / 3 *** '加算_1'([],S,S) :- ! . '加算_1'([A|R],Y,S) :- 'ならび'(A), 'ならび'(Y), !, 'ならび加算'(A,Y,Z), '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), '加算_1'(R,Y,S), ! . '加算_1'([A|R],Y,S) :- A1 'は' A, Z is A1 + Y, '加算_1'(R,Z,S) . '加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '加算_1'(L,Y,S) . % *** user: '加算_2' / 2 *** '加算_2'([],[]) :- ! . '加算_2'([L|R],[S|R2]) :- '加算'(L,S), '加算_2'(R,R2) . % *** user: '加算の変数に零をおく' / 1 *** '加算の変数に零をおく'([]) :- ! . '加算の変数に零をおく'([A|R]) :- '変数'(A), A = 0, '加算の変数に零をおく'(R), ! . ならび(L) :- is_list(L). list(L) :- is_list(L). % *** user: '逆交差要素の一' / 5 *** '逆交差要素の一'(_,N,Len,_,[]) :- N > Len, ! . '逆交差要素の一'(M,_,_,_,[]) :- M =< 0, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- M =< M - Len, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- N >= N + Len, ! . '逆交差要素の一'(M,N,Len,LL,[A|R]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆交差要素の一'(M1,N2,Len,LL,R), ! . % *** user: '逆行列' / 2 *** '逆行列'(_行列,_逆行列) :- length(_行列,N), '変数正方行列'(1,N,_逆行列), '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二), '既約ガウス行列に変形'(_行列の二,_既約ガウス行列), '行列の結合'(_,_逆行列,_既約ガウス行列) . % *** user: '各行で最初に現れる0ではない要素が1である' / 1 *** '各行で最初に現れる0ではない要素が1である'([]). '各行で最初に現れる0ではない要素が1である'([_行|R]) :- '最初に現れる0ではない要素が1である'(_行), '各行で最初に現れる0ではない要素が1である'(R) . % *** user: '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である' / 3 *** '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(_,_,[]). '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N,_行列,[_行|R]) :- '最初に現れる0ではない要素・位置'(1,_行,_列位置,1), N2 is N + 1, '列において他の要素がすべて0である'(_行列,N,_列位置), '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N2,_行列,R) . % *** user: '各行に単位行列の各行を結合して拡張した行列' / 3 *** '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二) :- '単位行列'(N,L), '行列の結合'(_行列,L,_行列の二) . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . % *** user: '変数分離' / 3 *** '変数分離'([],[],[]) :- ! . '変数分離'([V|R1],[V|R2],R3) :- var(V), '変数分離'(R1,R2,R3) . '変数分離'([A|R1],R2,[A|R3]) :- \+(var(A)), '変数分離'(R1,R2,R3) . % *** user: '変数でない項目だけ置き換える' / 3 *** '変数でない項目だけ置き換える'([],[],[]). '変数でない項目だけ置き換える'([Term|R1],[_|R2],[Term|R3]) :- \+(var(Term)), '変数でない項目だけ置き換える'(R1,R2,R3) . '変数でない項目だけ置き換える'([V|R1],[Term|R2],[Term|R3]) :- var(V), '変数でない項目だけ置き換える'(R1,R2,R3) . % *** user: '変数指定項複写' / 6 *** '変数指定項複写'(M,N,P,P1,V,V1) :- M > N, ! . '変数指定項複写'(M,N,P,P1,V,V1) :- arg(M,P,T), arg(M,P1,T1), '変数指定項複写'(T,T1,V,V1), M1 is M + 1, '変数指定項複写'(M1,N,P,P1,V,V1), ! . % *** user: '変数指定項複写' / 4 *** '変数指定項複写'(P,P1,V,V1) :- struct(P), functor(P,F,A), functor(P1,F,A), '変数指定項複写'(1,A,P,P1,V,V1), ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|_], L2 = [P1|_], P == V, ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|R1], L2 = [V2|R2], \+(P == V), '変数指定項複写'(P,P1,R1,R2), ! . '変数指定項複写'(P,P1,V,P1) :- var(P), var(V), P == V, ! . '変数指定項複写'(P,P1,V,V1) :- var(P), var(V), \+(P == V), ! . '変数指定項複写'(P,P1,V,V1) :- \+(var(P)), parse_atom(P,1,Q,_), \+(P == Q), sprintf('%q',[P],P1), ! . '変数指定項複写'(P,P,V,V1). % *** user: '変数を順に単一化する' / 3 *** '変数を順に単一化する'(_,[],[]) :- ! . '変数を順に単一化する'([],X,X) :- ! . '変数を順に単一化する'([A|R1],[V|R2],[A|R3]) :- var(V), '変数を順に単一化する'(R1,R2,R3), ! . '変数を順に単一化する'([A|R1],[B|R2],[B|R3]) :- \+(var(B)), '変数を順に単一化する'([A|R1],R2,R3) . % *** user: '変数を順に固定値に置換' / 5 *** '変数を順に固定値に置換'([],_,[],X,X) :- ! . '変数を順に固定値に置換'(R,_,R,[],[]) :- ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), \+((member(B,_忌避変数ならび) , A == B)), A = _固定値, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), member(B,_忌避変数ならび), A == B, '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- atomic(A), '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R0,L,L1), B =.. L1, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . % *** user: '変数を順に固定値に置換' / 4 *** '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,_対象ならび,_置換ならび), ! . % *** user: '変数を順に固定値に置換' / 3 *** '変数を順に固定値に置換'(_固定値ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,[],_対象ならび,_置換ならび), ! . % *** user: '変数名の解決' / 1 *** '変数名の解決'([]) :- ! . '変数名の解決'([Varname = Var|R]) :- var(Var), Varname = Var, '変数名の解決'(R), ! . % *** user: '変数ならびの生成' / 3 *** '変数ならびの生成'(N,N,[]) :- ! . '変数ならびの生成'(S,E,[A|R]) :- S < E, S1 is S + 1, '変数ならびの生成'(S1,E,R) . % *** user: '変数を固定値に置換' / 3 *** '変数を固定値に置換'(A,X,X) :- var(X), A = X, ! . '変数を固定値に置換'(_,[],[]) :- ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- var(A), A = _固定値, '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- atomic(A), '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を固定値に置換'(_固定値,L,L1), B =.. L1, '変数を固定値に置換'(_固定値,R,R1), ! . % *** user: '変数束縛表示' / 1 *** '変数束縛表示'([]) :- ! . '変数束縛表示'([VN = V]) :- '表示'('%t = %q',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q.',[VN,V]), told, tell(F), ! . '変数束縛表示'([VN,V|R]) :- '表示'('%t = %q,',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q,',[VN,V]), told, tell(F), '変数束縛表示'(R) . % *** user: '変数ならび表示' / 1 *** '変数ならび表示'([]) :- ! . '変数ならび表示'([_変数項]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), reads(X), !, \+(X = (;)) . '変数ならび表示'([_変数項|_残りならび]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), '変数ならび表示'(_残りならび) . % *** user: '変数' / 1 *** '変数'(_項) :- var(_項) . % *** user: '変数ならび' / 3 *** '変数ならび'(0,R,R) :- ! . '変数ならび'(N,[_|R],X) :- M is N - 1, '変数ならび'(M,R,X) . % *** user: '変数ならび' / 1 *** '変数ならび'([]) :- ! . '変数ならび'([_変数|_残りならび]) :- '変数'(_変数), !, '変数ならび'(_残りならび) . % *** user: '変数ならび生成' / 2 *** '変数ならび生成'(0,[]) :- ! . '変数ならび生成'(_生成数,[_生成された変数|_残りならび]) :- _残り生成数 'は' _生成数 - 1, '変数ならび生成'(_残り生成数,_残りならび) . % *** user: '変数が存在する' / 1 *** '変数が存在する'([V|_]) :- var(V), ! . '変数が存在する'([Q|_]) :- struct(Q), Q =.. [_|L], '変数が存在する'(L), ! . '変数が存在する'([_|R]) :- '変数が存在する'(R) . % *** user: '変数正方行列' / 3 *** '変数正方行列'(M,N,[]) :- M > N . '変数正方行列'(M,N,[L|R]) :- length(L,N), M2 is M + 1, '変数正方行列'(M2,N,R) . % *** user: '変数は全て単一' / 2 *** '変数は全て単一'([],_). '変数は全て単一'([A|B],A) :- var(A), '変数は全て単一'(B,A) . '変数は全て単一'([A|B],C) :- \+(var(A)), '変数は全て単一'(B,C) . % *** user: '逆置' / 3 *** '逆置'(_順列,_ある要素,_逆置要素) :- append(_,[_ある要素|R],_順列), append(_,[_逆置要素|R1],R), _逆置要素 < _ある要素 . % *** user: '逆交差要素' / 5 *** '逆交差要素'(M,N,Len,LL,X) :- M2 is M + N - 1, '逆交差要素'(M2,Len,LL,X) . % *** user: '逆交差要素' / 4 *** '逆交差要素'(M,Len,_,_) :- M - Len >= Len, !, fail . '逆交差要素'(M,Len,LL,L) :- M =< Len, '逆交差要素の一'(M,1,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M > Len, N is M - Len + 1, '逆交差要素の一'(Len,N,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M2 is M + 1, '逆交差要素の一'(M2,Len,LL,L) . % *** user: '逆交差要素' / 2 *** '逆交差要素'(LL,L) :- length(LL,Len), '逆交差要素'(1,Len,LL,L) . % *** user: '逆斜行要素' / 7 *** '逆斜行要素'(M,N,Len1,Len2,LL,Z,X) :- M2 is M + N - 1, '逆斜行要素'(M2,Len1,Len2,LL,Z,X) . % *** user: '逆斜行要素' / 6 *** '逆斜行要素'(M,Len1,Len2,_,_,_) :- M - Len1 >= Len1, !, fail . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M =< Len1, '逆斜行要素の一'(M,1,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M > Len1, N is M - Len1 + 1, '逆斜行要素の一'(Len1,N,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len1,Len2,LL,Z,L) . % *** user: '逆斜行要素' / 5 *** '逆斜行要素'(M,Len,_,_,_) :- M - Len >= Len, !, fail . '逆斜行要素'(M,Len,LL,Z,L) :- M =< Len, '逆斜行要素の一'(M,1,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M > Len, N is M - Len + 1, '逆斜行要素の一'(Len,N,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len,LL,Z,L) . % *** user: '逆斜行要素' / 2 *** '逆斜行要素'(LL,L) :- length(LL,Len), '逆斜行要素'(1,Len,LL,_,L) . % *** user: '逆斜行要素の一' / 7 *** '逆斜行要素の一'(_,N,Len1,Len2,_,[],[]) :- N > Len2, ! . '逆斜行要素の一'(M,_,_,_,_,[],[]) :- M =< 0, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- M =< M - Len1, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- N >= N + Len2, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[[M,N]|R1],[A|R2]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆斜行要素の一'(M1,N2,Len1,Len2,LL,R1,R2), ! . % *** user: '逆斜行要素の一' / 6 *** '逆斜行要素の一'(M,_,_,_,[],[]) :- M =< 0, ! . % *** user: '上三角行列' / 3 *** '上三角行列'(N,N,_) :- ! . '上三角行列'(M,N,_行列) :- M2 is M + 1, nth1(M2,_行列,_行), findall(0,for(1,I,M),L), append(L,_,_行), '上三角行列'(M2,N,_行列) . % *** user: '上三角行列' / 1 *** '上三角行列'(_行列) :- length(_行列,_行), '上三角行列'(1,_行,_行列) . % *** user: '下三角行列' / 3 *** '下三角行列'(N,N,_) :- ! . '下三角行列'(M,N,_行列) :- nth1(M,_行列,_行), M2 is M + 1, findall(0,for(N,I,M2),L), append(_,L,_行), '下三角行列'(M2,N,_行列) . % *** user: '下三角行列' / 1 *** '下三角行列'(_行列) :- length(_行列,_行), '下三角行列'(1,_行,_行列) . % *** user: '零行列' / 1 *** '零行列'([]) :- ! . '零行列'([A|R]) :- '零行列_1'(A), '零行列'(R) . % *** user: '零行列_1' / 1 *** '零行列_1'([]) :- ! . '零行列_1'([0|R]) :- !, '零行列_1'(R) . '零行列_1'([0.0e+00|R]) :- '零行列_1'(R) . % *** user: '零以外の最初の要素が1' / 1 *** '零以外の最初の要素が1'([1]) :- ! . '零以外の最初の要素が1'([1|_]) :- ! . '零以外の最初の要素が1'([0|R]) :- '零以外の最初の要素が1'(R) . % *** user: '約分の二' / 3 *** '約分の二'(_分子,1,_分子) :- ! . '約分の二'(_分子,1.0,_分子) :- ! . '約分の二'(_分子,_分母,_分子 / _分母). % *** user: '約分' / 2 *** '約分'(B / A,X) :- '最大公約数'(B,A,C), _分子 is B // C, _分母 is A // C, '約分の二'(_分子,_分母,X), ! . % *** user: (all) / 2 *** all([],_). all([A|R],A) :- all(R,A). % *** user: '右下がり対角要素ならび' / 3 *** '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,(nth1(_nth1,_正方行列,L) , nth1(_nth1,L,V)),_右下がり対角要素ならび) . % *** user: '右上がり対角要素ならび' / 3 *** '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,(append(_,[L|R],_正方行列) , length([_|R],_nth1) , nth1(_nth1,L,V)),_右上がり対角要素ならび), ! . % *** user: '二つの対角要素を得る' / 4 *** '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび), '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) . % *** user: '二つの対角要素の積を得る' / 4 *** '二つの対角要素の積を得る'(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), '対角要素の掛算'(_右下がり対角要素ならび,_右下がり対角要素の積), '対角要素の掛算'(_右上がり対角要素ならび,_右上がり対角要素の積) . % *** user: '二つのならびの積の和' / 3 *** '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B . % *** user: '二つのならびの同一順序要素の結合' / 3 *** '二つのならびの同一順序要素の結合'([],[],[]). '二つのならびの同一順序要素の結合'([A|R1],[B|R2],[C|R3]) :- append(A,B,C), '二つのならびの同一順序要素の結合'(R1,R2,R3) . % *** user: '二つの要素を交換する' / 4 *** '二つの要素を交換する'(L1,_要素位置1,_要素位置2,L2) :- nth1(_要素位置1,L1,A), nth1(_要素位置2,L1,B), '指定要素を置換する'(1,L1,[[_要素位置1,B],[_要素位置2,A]],L2) . % *** user: '対角要素の掛算' / 2 *** '対角要素の掛算'([],1). '対角要素の掛算'([A|R],X) :- '対角要素の掛算'(R,Y), X is A * Y . % *** user: '対角行列' / 3 *** '対角行列'(N,_対角要素が変数の対角行列,_変数ならび) :- integer(N), length(L,N), length(LX,N), findall([X,A],(append(L1,[A|L2],L) , length(L1,N1) , length(L11,N1) , length(L2,N2) , length(L22,N2) , L11 all 0 , L22 all 0 , append(L11,[A|L22],X)),LY), '対角行列_1'(LY,_対角要素が変数の対角行列,_変数ならび) . % *** user: '対角行列' / 2 *** '対角行列'(N,L) :- integer(N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角行列' / 1 *** '対角行列'(L) :- \+(var(L)), length(L,N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角要素' / 4 *** '対角要素'(M,N,_,[]) :- M > N, ! . '対角要素'(M,N,_行列,[_要素|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_要素), M2 is M + 1, '対角要素'(M2,N,_行列,R) . % *** user: '対角要素' / 2 *** '対角要素'(_行列,_対角要素) :- list_length(_行列,N), '対角要素'(1,N,_行列,_対角要素) . % *** user: '対角行列_1' / 3 *** '対角行列_1'([],[],[]) :- ! . '対角行列_1'([[L,V]|R1],[L|R2],[V|R3]) :- '対角行列_1'(R1,R2,R3) . % *** user: '対角成分' / 4 *** '対角成分'(M,N,_,[]) :- M > N, ! . '対角成分'(M,N,_行列,[_成分|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_成分), M2 is M + 1, '対角成分'(M2,N,_行列,R) . % *** user: '対角成分' / 2 *** '対角成分'(_行列,_対角成分) :- list_length(_行列,N), '対角成分'(1,N,_行列,_対角成分) . % *** user: '対角要素に交差した要素' / 2 *** '対角要素に交差した要素'(_行列,_対角要素に交差した要素) :- reverse(_行列,_行を逆順にした行列), '対角要素'(_行を逆順にした行列,_対角要素の一), reverse(_対角要素の一,_対角要素に交差した要素) . % *** user: '指定要素を置換する' / 4 *** '指定要素を置換する'(_,[],_,[]). '指定要素を置換する'(N,[L1|R1],_置換情報,[L2|R2]) :- member([N,L2],_置換情報), N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . '指定要素を置換する'(N,[L1|R1],_置換情報,[L1|R2]) :- N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findavg(A,B,C) :- findsum(A,B,S), length(A,D), C is S / D. % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の整列' / 5 *** '列の整列'(_,_,_,[],[]) :- ! . '列の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . '列の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . % *** user: '列の整列' / 4 *** '列の整列'(_列目から,_列目まで,_表,_整列した表) :- '行列の転置'(_表,_転置表), '列の整列'(1,_列目から,_列目まで,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の整列' / 2 *** '列の整列'(_表,_整列した表) :- '行列の転置'(_表,_転置表), list_length(_転置表,E), '列の整列'(1,1,E,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の反転' / 5 *** '列の反転'(_,_,_,[],[]) :- ! . '列の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . '列の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . % *** user: '列の反転' / 4 *** '列の反転'(_列目から,_列目まで,_表,_反転した表) :- '行列の転置'(_表,_転置表), '列の反転'(1,_列目から,_列目まで,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列の反転' / 2 *** '列の反転'(_表,_反転した表) :- '行列の転置'(_表,_転置表), length(_転置表,E), '列の反転'(1,1,E,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- 組合せ(R1,N,R2). % *** user: 'LU分解' / 2 *** 'LU分解'(LL1,LL2) :- '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび), 'LU分解'(_回数制御ならび,LL1,LL2). % *** user: '行数・列数のうち小さい方の回数制御ならび' / 2 *** '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび) :- 行数(LL1,_行数), 列数(LL1,_列数), min_list([_行数,_列数],Len), length(Ln,Len). 行数(LL1,_行数) :- length(LL1,_行数). 列数([L|_],_列数) :- length(L,_列数). % *** 'n次正方の疎行列の生成' / 3 *** 'n次正方の疎行列の生成'(_n,_行位置_列位置_値ならび,_n次正方の疎行列) :- 変数正方行列(1,_n,_n次正方の疎行列), 正方の疎行列の生成(_行位置_列位置_値ならび,_n次正方の疎行列), n次正方の疎行列の変数を0で埋める(_n次正方の疎行列). % *** 正方の疎行列の生成 / 2 *** 正方の疎行列の生成([],[]) :- !. 正方の疎行列の生成([[_i,_j,_値]|R],_n次正方の疎行列) :- nth1(_i,_n次正方の疎行列,L), nth1(_j,L,_値), 正方の疎行列の生成(R,_n次正方の疎行列). % *** n次正方の疎行列の変数を0で埋める / 1 *** n次正方の疎行列の変数を0で埋める([]) :- !. n次正方の疎行列の変数を0で埋める([L|R]) :- ならびの変数を0で埋める(L), n次正方の疎行列の変数を0で埋める(R). % *** ならびの変数を0で埋める / 1 *** ならびの変数を0で埋める([]). ならびの変数を0で埋める([0|R]) :- ならびの変数を0で埋める(R),!. ならびの変数を0で埋める([A|R]) :- ならびの変数を0で埋める(R). % *** user: 'LU分解' / 3 *** 'LU分解'([],LL,LL). 'LU分解'([_|Ln],_主小行列_1,[_lL|_LU_3]) :- '_lLと_uLと_主小行列に分割し主小行列部分を計算する'(_主小行列_1,_lL,_uL,_主小行列_2), 'LU分解'(Ln,_主小行列_2,_LU_2), '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). % *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する' / 4 *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する'([_lL|R1],_lL,_uL,_主小行列) :- _lL = [_l|L], '_uLと_主小行列を切り出す'(_l,R1,_uL,R2), '主小行列部分を計算する'(R2,_lL,_uL,_主小行列). % *** '_uLと_主小行列を切り出す' / 4 *** '_uLと_主小行列を切り出す'(_,[],[],[]). '_uLと_主小行列を切り出す'(_l,[[_u_1|L]|R2],[_u_2|R3],[L|R4]) :- 分数を含む除算(_u_1,_l,_u_2), '_uLと_主小行列を切り出す'(_l,R2,R3,R4). % *** '主小行列部分を計算する' / 4 *** 主小行列部分を計算する([],[],[],[]). 主小行列部分を計算する([L1|R1],_lL,[_u|_uL],[L3|R4]) :- 主小行列部分の一行を計算する(L1,_lL,_u,L3), 主小行列部分を計算する(R1,_lL,_uL,R4). % *** '主小行列部分の一行を計算する' / 4 *** 主小行列部分の一行を計算する([],[],_,[]) :- !. 主小行列部分の一行を計算する([_d_1|R1],[_l|R3],_u,[_d_2|R4]) :- '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2), 主小行列部分の一行を計算する(R1,R3,_u,R4). % *** '_d_2 is _d_1 - _u * _l' / 4 *** '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2) :- 分数を含む掛算(_u,_l,Y), 分数を含む減算(_d_1,Y,_d_2). % *** '_uLを主小行列に貼り付ける' / 3 *** '_uLを主小行列に貼り付ける'([],[],[]). '_uLを主小行列に貼り付ける'([_u|_uL],[L1|_LU_2],[[_u|L1]|_LU_3]) :- '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). 行列の置換(_列,_行,_置換要素,_対象行列,_置換された表) :- list_nth(_行,_対象行列,_対象行), 要素番号によるならびの置換(_列,_置換要素,_対象行,_置換された行), 要素番号によるならびの置換(_行,_置換された行,_対象行列,_置換された表),!. ならびの置換(_対象要素,_置換要素,_対象ならび,_置換ならび) :- append(_前半のならび,[_対象要素|_残り対象要素ならび],_対象ならび), append(_前半のならび,[_置換要素|_残り対象要素ならび],_置換ならび),!. ならびの置換(X,[],X) :- !. ならびの置換([],X,X) :- !. ならびの置換([A|R],[A|R1],[A|R2]) :- ならびの置換(R,R1,R2). ならびの置換([A|R],[B|R1],[A|R2]) :- ならびの置換(R,R1,R2). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび),!. update_list(Pos,U,P,Q) :- integer(Pos),!, update_list(1,Pos,U,P,Q). update_list(Pos,U,P,Q) :- not(integer(Pos)), not(Pos =.. [',',Pos1,Rpos]), Pos1 is Pos, update_list(1,Pos1,U,P,Q). update_list(Pos,U,P,Q) :- Pos =.. [',',Pos1,Rpos], update_list(1,Pos1,Rpos,U,P,Q). update_list(_,_,_,_,[],[]):-!. update_list(_,V,Rpos,U,[A|R],[B|R1]) :- var(V),!, update_list(Rpos,U,A,B), update_list(_,V,Rpos,U,R,R1). update_list(E,E,Rpos,U,[A|R],[B|R1]) :- update_list(Rpos,U,A,B), update_list(R,R1). update_list(S,E,Rpos,U,[A|R],[A|R1]) :- S1 is S+1, update_list(S1,E,Rpos,U,R,R1). update_list(E,E,U,[A|R],[U|R1]) :- update_list(R,R1). update_list(S,E,U,[A|R],[A|R1]) :- S1 is S+1, update_list(S1,E,U,R,R1). update_list([],[]):-!. update_list([A|R],[A|R1]) :- update_list(R,R1). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/290 # # tblA # pkey|value # ----+----- # 1  |a # 2  |b # # tblB # pkey|value # ----+----- # 1  |c # # ・欲しい結果 # tblA # pkey|value # ----+----- # 1  |c # 2  |b tblA(1,a). tblA(2,B). tblB(1,c). update(_対象述語/Arity1,_キー位置1,_被置換項位置,_置換指定述語/Arity2,_キー位置2,_置換項位置) :-   length(L1,Arity1),   length(L2,Arity2),   P1 =.. [_対象述語|L1],   P2 =.. [_置換指定述語|L2],   list_nth(_キー位置1,L1,A),   list_nth(_キー位置2,L2,A),   list_nth(_置換項位置,L2,B),   call(P2),   call(P1),   retract(P1),   ならびの位置指定置換(_被置換項位置,B,L1,L3),   P3 =.. [_対象述語|L3],   asserta(P3). document.writeln(""); //--> document.writeln(""); //--> S 1- V50 [PR]KWFbg j[X[PR] # vO (a)-(j)for gB #include<stdio.h> int main() { int a[10]; double sum,ave; sum=0; a[0]=1; a[1]=5; a[2]=7; a[3]=2; a[4]=4; a[5]=1; a[6]=9; a[7]=4; a[8]=20; a[9]=5; sum=sum+a[0];
# /* (a) */ sum=sum+a[1]; /* (b) */ sum=sum+a[2]; /* (c) */ sum=sum+a[3]; /* (d) */ sum=sum+a[4]; /* (e) */ sum=sum+a[5]; /* (f) */ sum=sum+a[6]; /* (g) */ sum=sum+a[7];
# /* (h) */ sum=sum+a[8]; /* (i) */ sum=sum+a[9]; /* (j) */ ave=sum/10; printf("a %d B %d B\n",sum, ave); }
#
# S
# 5A\ヲAt\ヲvOB
# タsF F 3 F 7 F1 F 2 F 5
# \ヲ 3 7 1 2 5 t\ヲ 5 2 1 7 3 vOeLXgRs[eLXgtB[ho\toB

At@xbgtAt@xbg(,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x, y,z],[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]).
At@xbgtAt@xbg(,['A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],['Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A']). stack_operation(1,Stack1,Stack) :- write('f[^ :'),get_integer(N),push(N,Stack,Stack2),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack). pop(A,Stack1,Stack2),write_formatted('|bvf[^%tB \n',[A]),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack). &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # t@Ct@CJAf[^L^Bvoid_read_data_file(char*file)A fileOwt@CJAdzW[]liz[]f[^B

@@get_file_info(_pX,[dev(Dev),ino(Ino),mode(Modes),nlink(Nlink),uid (Uid),uname(Uname),gid(Gid),gname(Gname),size(_TCY),atime(Atime),mtime (Mtime),ctime(_IX),blksize(Blksize),blocks(Blocks)]),
@@member(FI,Modes),
@@sub_atom(FI,0,2,_,if),
@@t@C(FI,_).

t@C(ifblk,ubNt@C).
t@C(ifchr,LN^t@C).
t@C(ififo,pCv).
t@C(ifreg,t@C).
t@C(ifdir,fBNg).
t@C(iflnk,V{bNN).

sBsB
VX\ヲ
S O100 100 V50 OF E-mail () :
# 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/474 # # SQL Server Compact 3.5 で、a_tbl と b_tbl のコードが一致した場合に # a_tbl に、b_tblの名前をセットするみたいなことしたいのですが無理ですか? # # UPDATE a_tbl # SET name = b_tbl.name # FROM b_tbl # WHERE a_tbl.no = b_tbl.no # # 実行すると、「FROM 句はこのクエリの種類では使用できません」ってエラーになります。 # SQL Server 2008 だと問題ないのですが・・・ # a_tbl(1,abc). a_tbl(2,add). b_tbl(1,uuu). b_tbl(2,jjj). 'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする' :-   a_tbl(_no,_name1),   b_tbl(_no,_name2),   update_a_tbl(_no,_name2),   fail. 'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする'. update_a_tbl(_no,_name2) :-   retract(a_tbl(_no,_)),   assertz(a_tbl(_no,_name2)),   fail. update_a_tbl(_,_). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/877 # # T_USER T_HOGE T_MAG         T_USER # ID|NUM  ID      MAG             ID|NUM # --|---- --      --             --|---- # A | 100  A      100  .→→→    A | 300 # B | 100  A         update結果  B | 200 # C | 100  B                   C | 100 # # 「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果を # T_USER.NUMに対し加算するUPDATE文を書きたいのですが # どうすればよいでしょうか。IDはVARCHAR型です。 # DBMSはMySQL 5.1です。 # # '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文' :- '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(_), fail. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(ID) :- 'T_MAG'(MAG), retract('T_USER'(ID,NUM)), count('T_HOGE'(ID),Count), NUM2 is NUM + MAG * Count, assertz('T_USER'(ID,NUM2)). # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/488 # # updateのwhere in句でワイルカードを使いたいのですが、 # mysqlで、 UPDATE table SET col='新しいデータ' where col in ('001古%', '003古%'.) としたのですが、 # 上手く出来ませんでした。 # # どうしたら出来るのでしょうか。 # # % 新しいデータ(新しいデータ). 節の定義順を保って述語を更新したい :- findall(_col,retract(table(_col)),L), append(_,[A|R],L), update_data(A,B), assertz(table(B)), R = [],!. update_data(_col,_新しいデータ) :- sub_atom(_col,0,4,_,'001古'),新しいデータ(_新しいデータ),!. update_data(_col,_新しいデータ) :- sub_atom(_col,0,4,_,'003古'),新しいデータ(_新しいデータ),!. update_data(_col,col). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/471 # # 【質問テンプレ】 # ・DBMS名とバージョン: SQLite 3 # ・テーブルデータ:長いため下記に記載 # ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。 # ・説明:長いため下記に記載 # # ●テーブルデータ # ======================================================================================================================= # ■entries #  | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text #  | title | content | authors | tags | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text_content #  | docid | c0title | c1content | c2authors | c3tags | # ----------------------------------------------------------------------------------------------------------------------- # ■sqlite_sequence #  | name | seq | # ======================================================================================================================= # # 1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。 # # 2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した #   [id]フィールドと同じ値のレコードも削除。 # # 3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と #   同じレコード番号のレコードを削除。 ※idフィールドがない為 # # 4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 #   【entries】テーブルの[id]フィールド #   【entries_text_content】テーブルの[docid]フィールド # # 5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。 # # 6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を #   設定したい。 # # お手数ですが、以上よろしくお願いします。 # # '1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除' :- findsetof(_id,( entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), _deleted = '2'), L1), retract_all(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,'2',_bookmarkID)), findsetof(_docid,( member(_id,L1), entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)), _docid = _id), L2), '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2), '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1),!. '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2) :- member(_docid,L2), retract_all(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1) :- append(_,[Nth|R],L1), 節の定義位置指定による節の削除(L2,Nth), R = [],!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(_). 節の定義位置指定による節の削除(L2,Nth) :- findall((Head :- Body),( clause(entries_text(_title,_content,_authors,_tags),Head,Body)), L2), list_nth(Nth,L2,P), retract(P),!. '4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 【entries】テーブルの[id]フィールド 【entries_text_content】テーブルの[docid]フィールド' :- findall(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),( retract(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID))), L1), append(L01,[entries(_,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)|R1],L1), length([_|L0],Nth1), assertz(entries(Nth1,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), R1 = [], findall(entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags),( retract(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags))), L2), append(L02,[entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags)|R2],L2), length([_|L02],Nth2), assertz(entries_text_contents(Nth2,_c0title,_c1content,_c2authors,_c3tags)), R2 = [],!. '5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。'(Count) :- count(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),Count), count(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags),Count), count(entries_text(_title,_content,_authors,_tags),Count). '6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を設定したい。'(Count) :- retract(sqlite_sequence(_name,_seq)), assertz(sqlite_sequence(_name,Count),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/374 # # [1]授業単元:オペレーティングシステム論 # [2]課題:適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。 # それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する。 # これを10万回繰り返すプログラムを作成し、HD、SSD、USBフラッシュメモリ等のデバイスの差 # 処理時間がどのくらい変わるかテストするプログラムを作成せよ # [3] OS:Windows IDE:Visual studio 2008 言語:C # [4] 6/15まで # [5] ディスクキャッシュが大きいとディスクに短期間では確実に書き込まれるとは限らないので、ファイルを100個作って1000回 # 繰り返すプログラムにしたほうが良い # とのことです。 # コードだけでなく、実行時間もお願いします。 # # '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する' :- '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream), それをクローズし(Outstream), 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File). '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream) :- tmpnam(File), open(File,write,Outstream,[type(binary)]), for(1,N,100000000), Code is random(256), put_byte(Outstream,Code), N = 100000000,!. それをクローズし(Outstream) :- close(Outstream). 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File) :- open(File,update,Updatestream,[type(binary)]), repeat, ( at_end_of_stream(Updatestream); get_byte(Updatestream,Byte), Byte1 is Byte - 255, put_byte(Updatestream,Byte1), fail ), close(Updatestream). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/478 # # [1] 授業単元:プログラム実行カウンタの作成 # [2] 問題文(含コード&リンク): # log.txtのファイルを利用して、作成したプログラムが何回目の実行かを画面表示するプログラムを作成しなさい # なお、簡単のため、log.txtには初めに0と入力し、保存しておいてもかまわない # 'log.txtのファイルを利用して、作成したプログラムが何回目の実行かを画面表示するプログラムを作成しなさい' :- open('log.txt',update,Updatestream), readln(Updatestream,[N]), N2 is N + 1, write(Updatestream,N2), close(Updatestream),!, writef('このプログラムは%t回目の実行です\n',[N2]),!. # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/411 # # MySQL 5.1.46 # #   ≪item≫ # ───────── # id  name  category # ───────── # 1  Name1   2 # 2  Name2   1 # 3  Name3   1 # 4  Name4   6 # 5  Name5   4 # 6  Name6   8 # 7  Name7   2 # 8  Name8   2 # ───────── # # item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い # # UPDATE item SET category = 7 WHERE category = 2 # # を発行したのですが、うまく動作しません。 # こういう場合にうまくいく方法を教えてください。 # # 'item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い' :- 節順序を変更するupdate(item/3,[[3,2]],[[3,7]]). 節順序を変更するupdate(_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L) :- 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L),!. 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを先頭に付加する(_述語名,L),!. 節順序を変更するupdate(末尾,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを末尾に付加する(_述語名,L),!. 更新ならびを先頭に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], asserta(_述語3), R = []. 更新ならびを末尾に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], assertz(_述語3), R = []. 鍵情報を設定する([],L). 鍵情報を設定する([[_鍵位置,_鍵]|R],L) :- nth1(_鍵位置,L,_鍵), 鍵情報を設定する(R,L). 更新情報を設定する([],L,L). 更新情報を設定する([[_更新位置,_更新値]|R1],L1,L) :- append(L0,[_|R],L1), length([_|L0],_更新位置), append(L0,[_更新値|R],L2), 更新情報を設定する(R1,L2,L). # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/153 # # if select * from t where id=1 # then update t set foo=bar where id=1 # # これをSQLで表現したいのですが可能でしょうか? # # 'if select * from t where id=1 then update t set foo=bar where id=1' :- '1要素のupdate'(t,id1,'1',foo,bar). '1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :- 組構造を得る(_テーブル名,_属性名ならび), 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P), 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項), retract(_現在の項), '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組), asserta(_置換する項). 組構造を得る(_テーブル名,_属性名ならび) :- findall([_属性番号,_属性名],( テーブル構造(_テーブル名,_属性番号,_属性名)), L1), sort(L1,L2), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび). 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :- 置換する組(_属性名ならび,_置換する組), 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組), _置換項 =.. [_テーブル名|_置換する組]. 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :- 現在の組(_属性名ならび,_現在の組), 鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組), _現在の項 =.. [_テーブル名|_現在の組]. 現在の組(_属性名ならび,_現在の組) :- length(_属性名ならび,Len), length(_現在の組,Len). 置換する組(_属性名ならび,_置換する組) :- length(_属性名ならび,Len), length(_置換する組,Len). 鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :- nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_現在の組,_鍵値),!. 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :- nth1(_置換属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_置換する組,_鍵値),!. '置換する組の変数部分だけ元の値に単一化する'([],[]). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :- '置換する組の変数部分だけ元の値に単一化する'(R1,R2). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :- \+(A = B), '置換する組の変数部分だけ元の値に単一化する'(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/996 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/30Mz7Pbj # このプログラムで何番目の値段をかえるではなく # 名前を聞かれてその名前の値段をかえるプログラムにする。 # # #include # #include # main() # { # struct goods{ # char name[20]; # char price[5]; # }record; # FILE *fp; # int max,size,num; # long top,end,locat,ftell(); # fp=fopen("file1","r+"); # if(fp==NULL){ # printf("open error"); # exit(1); # } # size=sizeof(record); # fseek(fp,0L,2); # end=ftell(fp); # fseek(fp,0L,0); # top=ftell(fp); # max=(end-top)/size; # do{ # printf("rec no?\n"); # scanf("%d",&num); # }while(num<1||num>max); # locat=size*(num-1); # fseek(fp,locat,0); # fread(&record,size,1,fp); # printf("name=%s price=%s\n" # ,record.name,record.price); # printf("Current price\t:%s\n",record.price); # printf("New price?\t:"); # scanf("%s",record.price); # fseek(fp,-size,1); # fwrite(&record,size,1,fp); # fclose(fp); # printf("update....ended\n"); # } 'ファイル内の名前を鍵に指定して値段をかえる'(_ファイル名,_更新対象氏名,_値段) :- 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名), 値段の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた値段), open(_ファイル名,update,InOuttream), '名前を指定して値段をかえる'(InOutstream,_末尾に空白を埋めた対象氏名,_末尾に空白を埋めた値段), close(InOututstream). 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名) :- length(L,20), atom_chars(_更新対象氏名,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた更新対象氏名,L). 値段の末尾に空白を埋める(_値段,_末尾に空白を埋めた値段) :- length(L,5), number_chars(_値段,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた値段,L). '名前を指定して値段をかえる'(InOutstream,_,_) :- at_end_of_stream(InOutstream),!. '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段) :- 氏名を読み更新する(InOutstream,_更新対象氏名,_値段), 価格を更新する(InOutstream), '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段). 氏名を読み更新する(InOutstream,_更新対象氏名,_値段) :- findall(_文字,( between(1,20,N), get_char(InOutstream,_文字)), L), 更新対象氏名の時は価格も更新する(InOutstream,_更新対象氏名,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- atom_chars(_更新対象氏名,L), writef(InOutstream,'%t',[_更新対象氏名]), 価格を更新する(InOutstream,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- \+(atom_chars(_更新対象氏名,L)), 価格をそのまま書く(InOutstream). 価格を更新する(InOutstream,_値段) :- writef(InOutstream,'%t',[_値段]). all([],_). all([A|R],A) :- all(R,A). # 出典:: 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/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/db/1343899481/635 # # 質問です、お願いします # id|col1|col2 という構成のテーブルがあります # # これに対して、以下のような条件と動作を実現したいと思います # 1)更新できるのはcol2が0の場合のみ # 2)更新できた場合、'updated'を返す # 3)もし、col2が0以外の場合、'update_fail' という値を返す # # どんなクエリ文を書いたら良いんでしょうか # (利用してるDBはmysql5です) # # 'id|col1|col2 という構成のテーブルがあります これに対して、以下のような条件と動作を実現したいと思います 1)更新できるのはcol2が0の場合のみ 2)更新できた場合、\'updated\'を返す 3)もし、col2が0以外の場合、\'update_fail\' という値を返す どんなクエリ文を書いたら良いんでしょうか'(_id,_新しい_col1,_新しい_col2) :- クエリ文(_id,_新しい_col1,_新しい_col2). クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- 'idが存在しない場合、\'update_fail not found id\'を返す'(_id). '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id) :- table(_id,_col1,_col2), \+(_col2 = 0), writef('update_fail :: table(%q,%q,%q).\n',[_id,_col1,_col2]),!. '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2) :- retract(table(_id,_col1,0)), asserta(table(_id,_新しい_col1,_新しい_col2)), writef('updated :: table(%q,%q,%q).\n',[_id,_新しい_col1,_新しい_col2]),!. 'idが存在しない場合、\'update_fail not found id\'を返す'(_id) :- writef('update_fail not found id :: %q\n',[_id]). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/662 # # 1つのupdate文に set と条件 の組を複数指定できませんか。 # update table_foo # set x = new1 where x = old1, # set y = new2 where y = old2, # set z = new3 where y = old3 # みたいなことがしたい。 # # :- dynamic(table_foo/3). '1つのupdate文に set と条件 の組を複数指定できませんか。 update table_foo set x = new1 where x = old1, set y = new2 where y = old2, set z = new3 where y = old3 みたいなことがしたい。'(_x_1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3) :- retract(table_foo(_x_1,_y_1,_z_1)), 更新_1(_x_1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z). assertz(table_foo(_x,_y,_z)). 更新_1(_old1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z) :- 更新_2(_new1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z),!. 更新_1(_x_1,_y_1,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z) :- 更新_2(_x_1,_y_1,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z). 更新_2(_x,_old2,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z) :- 更新_3(_x,_new2,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z),!. 更新_2(_x,_y,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z) :- 更新_3(_x,_y,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z). 更新_3(_x,_y,_old3,_,_,_old3,_,_,_new3,_x,_y,_new3) :- !. 更新_3(_x,_y,_z,_,_,_,_,_,_,_x,_y,_z).