このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 128代目 #950 # 【質問テンプレ】 # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 下に示すように,要素数が7 でint 型の配列に読み込んだ全要素を逆順に # 並べ替えるプログラムを作成せよ. # # vx[ 0] : 58 # vx[ 1] : 32 # vx[ 2] : 17 # vx[ 3] : 46 # vx[ 4] : 22 # vx[ 5] : 73 # vx[ 6] : 69 # vx[ 0] = 69 # vx[ 1] = 73 # vx[ 2] = 22 # vx[ 3] = 46 # vx[ 4] = 17 # vx[ 5] = 32 # vx[ 6] = 58 % Prolog % ここでは定義された単位節の一引数だけソートして差し替える問題としてみよう。 t455 :- 指定引数だけ順序替えする単位節ソート(2,vx/2). vx(0,58). vx(1,32). vx(2,17). vx(3,46). vx(4,22). vx(5,73). vx(6,69). 指定引数だけ順序替えする単位節ソート(_鍵位置,Functor/Arity) :- 関数構造Pと鍵位置の値ならびL1を得る(_鍵位置,Functor/Arity,P,L1), 逆順に順序替えしてソート項目を差し替える(_鍵位置,P,L1). 関数構造Pと鍵位置の値ならびL1を得る(_鍵位置,Functor/Arity,P,L1) :- 関数構造Pを得る(_鍵位置,Functor/Arity,P), 鍵位置の値ならびをL1を得る(_鍵位置,P,L1). 関数構造Pを得る(_鍵位置,Functor/Arity,P) :- length(L,Arity), P =.. [Fuctor|L]. 鍵位置の値ならびをL1を得る(_鍵位置,P,L1) :- findall(K,( 節から鍵位置の値Kを取り出す(_鍵位置,P,K)),L1). 節から鍵位置の値Kを取り出す(_鍵位置,P,K) :- clause(P,_), arg(_鍵位置,P,K). 逆順に順序替えしてソート項目を差し替える(_鍵位置,P,L1) :- 逆順に順序替えして(L1,L3), ソート項目を差し替える(_鍵位置,P,L1,L3). ソート項目を差し替える(_鍵位置,P,L1,L3) :- 差し替えるためにLL1に保存しながら節Pを削除する(P,LL1), ソート項目の差し替え(_鍵位置,LL1,L3). 差し替えるためにLL1に保存しながら節Pを削除する(P,LL1) :- findall(_関数_引数ならび,( '定義節Pを削除し、その関数と引数のならびを得る(P,_関数_引数ならび)),LL1). '定義節Pを削除し、その関数と引数のならびを得る(P,_関数_引数ならび) :- retract(P), P =.. _関数_引数ならび. 逆順に順序替えして(L1,L3) :- msort(L1,L2), reverse(L2,L3). ソート項目の差し替え(_,[],[]) :- !. ソート項目の差し替え(_鍵位置,LL1,L2) :- ソート項目を差し替えて行く(_鍵位置,LL1,L2). ソート項目の差し替えて行く(_鍵位置,[[_関数|_引数ならび]|R1],[_鍵項目|R2]) :- replace_nth(_鍵位置,_鍵項目,_引数ならび,_置き換えられた引数ならび), P =.. [_関数|_置き換えられた引数ならび], assertz(P), ソート項目の差し替え(_鍵位置,R1,R2). replace_nth(N,K,L1,L) :- replace_nth(1,N,K,L1,L). replace_nth(N,N,K,[_|R],[K|R]) :- !. replace_nth(M,N,K,[A|R1],[A|R2]) :- succ(M,M2), replace_nth(M2,N,K,R1,R2).