このディレクトリの索引
#  出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/178
#  お題 
#  "この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" 
#  の□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。 
#   
#  元ネタ:https://www.facebook.com/NewtonScience/photos/a.314504251971427.78296.285001398255046/716155815139600/ 
# 
# 

'"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。"
という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。'(_正しい文章) :-
'1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4),
'"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。"
という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章),
正しい文章である(_正しい文章,_n1,_n2,_n3,_n4).

'1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4) :-
'1が□個'(_n1,_1),
'2が□個'(_n2,_2),
'3が□個'(_n3,_3),
'1から3以外の数字が□個ある'(_n4,_4).

'1が□個'(_n1,_1) :-
between(0,9,_n1),
number_chars(_n1,[_1]).

'2が□個'(_n2,_2) :-
between(0,9,_n2),
number_chars(_n2,[_2]).

'3が□個'(_n3,_3) :-
between(0,9,_n3),
number_chars(_n3,[_3]).

'1から3以外の数字が□個ある'(_n4,_4) :-
between(0,9,_n4),
number_chars(_n4,[_4]).

'"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。"
という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章) :-
swritef(_正しい文章,'この文字列には1が%t個,2が%t個,3が%t個,1から3以外の数字が%t個ある。',[_1,_2,_3,_4]).

正しい文章である(_正しい文章,_n1,_n2,_n3,_n4) :-
'1の度数は'(_正しい文章,_n1),
'2の度数は'(_正しい文章,_n2),
'3の度数は'(_正しい文章,_n3),
'1から3以外の数字の度数'(_正しい文章,_n4).

'1の度数は'(_正しい文章,_n1) :-
度数(sub_atom(_正しい文章,_,1,_,'1'),_n1).

'2の度数は'(_正しい文章,_n2) :-
度数(sub_atom(_正しい文章,_,1,_,'2'),_n2).

'3の度数は'(_正しい文章,_n3) :-
度数(sub_atom(_正しい文章,_,1,_,'3'),_n3).

'1から3以外の数字の度数'(_正しい文章,_n4) :-
度数((sub_atom(_正しい文章,_,1,_,A),member(A,['4','5','6','7','8','9','0'])),_n4).

度数(_目標,_度数) :-
findall(1,_目標,L),
length(L,_度数).