このディレクトリの索引

# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9554.txt 
# ◎フォネティックコード
# 
# 無線などで会話する際、A,B,Cなどのアルファベットをそのまま発音しても相手方に聞き取りにくい事がある.アルファベットを明瞭
# に伝達するために,各アルファベットに対して1つの単語が割り当てられており,これを使用することが国際的に定められている.
# この単語をフォネティックコードと呼ぶ. フォネティックコードファイルを読み込み,1つの文章を全てフォネティックコード化でき
# るようなプログラムを作成せよ.
# 課題実行においては以下の点に注意すること.
# ・プログラム名は「phon」とすること. 
# ・フォネティックコードはスペースで区切って表示すること. 
# ・コードファイル名を指定して読み込めるようにすること. 
# ・コードファイルのフォーマットは、a,Alphaのように、文字,コードの形式である 
# 
# 
# 
# 実行結果
# cat ./nato.cod
# a,Alfa
# b,Bravo
# c,Charlie
#  ・
#  ・
#  ・
# z,Zulu
# ./phon
# nato.cod
# OPA627
# Oscar Papa Alfa 627
# ./phon
# ./nato.cod
# IEICE
# India Echo India Charlie Alfa Echo
# 
# 
# 
# 
# フォネティックコード
# a,Alfa 
# b,Bravo 
# c,Charlie 
# d,Delta  
# e,Echo  
# f,Foxtrot 
# g,Golf 
# h,Hotel 
# i,India 
# j,Juliett 
# k,Kilo 
# l,Lima 
# m,Mike 
# n,November 
# o,Oscar 
# p,Papa 
# q,Quebec 
# r,Romeo
# s,Sierra 
# t,Tango 
# u,Uniform 
# v,Victor 
# w,Whiskey 
# x,X-ray 
# y,Yankee 
# z,Zulu 

phon(_フォネティックコードファイル,_文字列) :-
        assertz_フォネティックコード(_フォネティックコードファイル),
        atom_chars(_文字列,Chars),
        phon_1(Chars,XL),
        phon_2(XL).

phon_1([],[]) :- !.
phon_1([A],[C]) :-
        フォネティックコード(A,C),!.
phon_1([A],[A]) :-
        not(フォネティックコード(A,_)),!.
phon_1([A,B|R1],[C,' '|R2]) :-
        フォネティックコード(A,C),
        フォネティックコード(B,_),
        phon_1([B|R1],R2).
phon_1([A,B|R1],[C,' '|R2]) :-
        フォネティックコード(A,C),
        not(フォネティックコード(B,_)),
        phon_1([B|R1],R2).
phon_1([A,B|R1],[A,' '|R2]) :-
        not(フォネティックコード(A,_)),
        フォネティックコード(B,_),
        phon_1([B|R1],R2).
phon_1([A,B|R1],[A|R2]) :-
        not(フォネティックコード(A,_)),
        not(フォネティックコード(B,_)),
        phon_1([B|R1],R2).

phon_2([]).
phon_2([A|R]) :-
        write(A),
        phon_2(R).

assertz_フォネティックコード(_フォネティックコードファイル) :-
        フォネティックコードファイルの読み込み(_フォネティックコードファイル,Lines),
        abolish(フォネティックコード/2),
        フォネティックコードベースの登録(Lines).

フォネティックコードファイルの読み込み(_フォネティックコードファイル,Lines) :-
        get_lines(_フォネティックコードファイル,Lines).

フォネティックコードベースの登録(Lines) :-
        member(Line,Lines),
        split(Line,[','],[A,B]),
        forall(フォネティックコードベースの登録(A,B),true).

フォネティックコードベースの登録(A,B) :-
        assertz(フォネティックコード(A,B).
フォネティックコードベースの登録(A,B) :-
        to_upper(A,C),
        assertz(フォネティックコード(C,B).