ネットの 「全国郵便番号データ」から 全国一括 をダウンロードして行頭、行末に '(シングルクォート) 行末に .(ドット)を加え、また、"(ダブルクオート)を削除し、ファイル名を KEN_ALL.txt にします。UTF-8,改行Linuxにします。
あとは、実行例を参考に実行してください。
Windows でも実行しましたが、うまくできませんでした。(^_^;)
♪ 郵便番号データー一部 data
% head KEN_ALL.txt '01101,060 ,0600000,ホッカイドウ,サッポロシチュウオウク,イカニケイサイガナイバアイ,北海道,札幌市中央区,以下に掲載がない場合,0,0,0,0,0,0'. '01101,064 ,0640941,ホッカイドウ,サッポロシチュウオウク,アサヒガオカ,北海道,札幌市中央区,旭ケ丘,0,0,1,0,0,0'. '01101,060 ,0600041,ホッカイドウ,サッポロシチュウオウク,オオドオリヒガシ,北海道,札幌市中央区,大通東,0,0,1,0,0,0'. '01101,060 ,0600042,ホッカイドウ,サッポロシチュウオウク,オオドオリニシ(1-19チョウメ),北海道,札幌市中央区,大通西(1〜19丁目),1,0,1,0,0,0'. '01101,064 ,0640820,ホッカイドウ,サッポロシチュウオウク,オオドオリニシ(20-28チョウメ),北海道,札幌市中央区,大通西(20〜28丁目),1,0,1,0,0,0'. '01101,060 ,0600031,ホッカイドウ,サッポロシチュウオウク,キタ1ジョウヒガシ,北海道,札幌市中央区,北一条東,0,0,1,0,0,0'. '01101,060 ,0600001,ホッカイドウ,サッポロシチュウオウク,キタ1ジョウニシ(1-19チョウメ),北海道,札幌市中央区,北一条西(1〜19丁目),1,0,1,0,0,0'. '01101,064 ,0640821,ホッカイドウ,サッポロシチュウオウク,キタ1ジョウニシ(20-28チョウメ),北海道,札幌市中央区,北一条西(20〜28丁目),1,0,1,0,0,0'. '01101,060 ,0600032,ホッカイドウ,サッポロシチュウオウク,キタ2ジョウヒガシ,北海道,札幌市中央区,北二条東,0,0,1,0,0,0'. '01101,060 ,0600002,ホッカイドウ,サッポロシチュウオウク,キタ2ジョウニシ(1-19チョウメ),北海道,札幌市中央区,北二条西(1〜19丁目),1,0,1,0,0,0'.
♪ プログラムコード code
% yuubin.pl :- use_module(library(dialect/ifprolog)). /* atom_split/3 のため */ yuubin( S ) :- /* 質問のはじめ main() */ \+var(S), see('KEN_ALL.txt'), flag( hits, Hits, Hits-Hits ), repeat, read(Y), serch(Y,S), check(Y, Q), /* 以下( A_side ; B_side ) */ /* A_side か B_side どちらかを実効する */ ( /* 300ヒット以下は、repeat 間を繰り返す。*/ /* 300ヒットを超すと、'TOO MANY HITS!!'を表示 */ Q >= 300, write( 'TOO MANY HITS!!' ), nl ; Y == end_of_file /* ファイルの終わり? */ ), !, seen, fail. check( _, Q ) :- /* ここでは、単にヒット数をセットして返している */ flag( hits, Hits, Hits ), Q = Hits. write_data(end_of_file). /* 整形して表示 */ write_data(X) :- atom_split( X, ',', Z ), Z = [_,_,Y1,Y2,Y3,Y4,Y5,Y6,Y7|_], flag( hits, Hits, Hits+1 ), Hits1 is Hits + 1, format( '~a : [~a]~a~a~a(~a~a~a)~n' ,[Hits1,Y1,Y5,Y6,Y7,Y2,Y3,Y4] ). serch(Y,S):- sub_atom( Y, F, L, E, S ), atom_length( Y, Len1 ), Len2 is F + L + E, Len1 =:= Len2, write_data(Y). serch(_,_):-!.
♪実行
最大ヒット数を10から300へ変更しました
なので実行例は、実際と違います。
(空文字列を検索すると固まります。なのでヒット数を10(300に変更)以下としています。)
% swipl -q -s yuubin.pl ?- yuubin( おもろ ). 1 : [9000006]沖縄県那覇市おもろまち(オキナワケンナハシオモロマチ) false. ?- yuubin( 9000006 ). 1 : [9000006]沖縄県那覇市おもろまち(オキナワケンナハシオモロマチ) false. ?- yuubin( スマクラ ). 1 : [7500081]山口県下関市彦島角倉町(ヤマグチケンシモノセキシヒコシマスマクラチョウ) false. ?- yuubin( 久米島 ). 1 : [9013100]沖縄県島尻郡久米島町以下に掲載がない場合(オキナワケンシマジリグンクメジマチョウイカニケイサイガナイバアイ) 2 : [9013103]沖縄県島尻郡久米島町阿嘉(オキナワケンシマジリグンクメジマチョウアカ) 3 : [9013101]沖縄県島尻郡久米島町宇江城(オキナワケンシマジリグンクメジマチョウウエグスク) 4 : [9013138]沖縄県島尻郡久米島町上江洲(オキナワケンシマジリグンクメジマチョウウエズ) 5 : [9013105]沖縄県島尻郡久米島町宇根(オキナワケンシマジリグンクメジマチョウウネ) 6 : [9013106]沖縄県島尻郡久米島町奥武(オキナワケンシマジリグンクメジマチョウオウ) 7 : [9013123]沖縄県島尻郡久米島町大田(オキナワケンシマジリグンクメジマチョウオオタ) 8 : [9013132]沖縄県島尻郡久米島町大原(オキナワケンシマジリグンクメジマチョウオオハラ) 9 : [9013121]沖縄県島尻郡久米島町嘉手苅(オキナワケンシマジリグンクメジマチョウカデカル) 10 : [9013122]沖縄県島尻郡久米島町兼城(オキナワケンシマジリグンクメジマチョウカネグスク) TOO MANY HITS!! false. ?-