RSS

 

RSS


 先週に引き続き、紙の上に何が何個のその2。コードを直して条件の数が不定個の場合も解けるようにしてみた。
 testのところでは、候補を出して、チェックしてOKだったら、表示するということをやっている。

test(L):-  kouhoall(L),
 checkall(L),
 printall(L).

checkall(L):-checkall2(L,L).
checkall2(L,[]).
checkall2(L,[H1|C1]):-gethead(C1,H2,C2),count(H1,L,H2),checkall2(L,C2).

gethead([H|L],H,L).

kouhoall([]).
kouhoall([H|L]):-kouho(H),kouhoall(L).

printall([]):-print('\n').
printall([H|L]):-print(H),printall(L).

kouho(0).
kouho(1).
kouho(2).
kouho(3).
kouho(4).
kouho(5).
kouho(6).
kouho(7).
kouho(8).
kouho(9).

count(X,L,C):-csub(X,L,0,C).
csub(_,[],C,C).
csub(X,[H|L],N,C):-((H=X)->(N1 is N+1);(N1 is N)),csub(X,L,N1,C).

 前回の問題も、

1 ?- test([1,_,2,_,3,_,4,_,5,_]),fail.
1322334151

No
2 ?-

  と答えが1個出た。

 リストの中に問題をそのまま入れていくカタチ。[A,B,C,D,E,F,・・・]であれば、数字AがB個、数字CがD個、数字EがF個、・・・という意味。

 答えが複数あるときは、全部表示される。

2 ?- test([4,_,_,_]),fail.
4101
4112
4121
4122
4131
4151
4161
4171
4181
4191
4242
4444

No
3 ?-


 問題を解いて行く場合、変数が多いとやはり時間がかかるという課題は残る。

 それはさておき、いろいろ、手で入れて問題になりそうなものを探した。みつけたのが次の問題。

問題:□に数字を1個ずつ入れて成り立つようにしてみて下さい。

この紙の上には1が2個ある。
この紙の上には□が□個ある。
この紙の上には□が□個ある。

 今回作ったプログラムで言えば test([1,2,A,B,C,D]) ということ。

/////

  例えば「1以外の数字を使って」というような場合にの対応できて、そのときは kouho(1).を削除すればよい。


  • コメント (0)
  • トラックバック (0)
トラックバックURL :
http://www.iwai-masaka.jp/tb.cgi/962