'同じ値が複数ある時はそれを1 個とみなしてならびの数の個数を返す'(M,N,_ならび,_個数) :- ランダムに値を入力(M,N,_ならび), '同じ値が複数ある時はそれを1 個とみなしてならびの数の個数を返す'(M,_ならび,_個数). '同じ値が複数ある時はそれを1 個とみなしてならびの数の個数を返す'(M,_ならび,_個数) :- length(L,M), 出現検査(_ならび,L), 値の存在する個数を調べる(L,_個数). 出現検査([],L) :- !. 出現検査([I|R],L) :- length(L0,I), append(L0,[V|_],L), V = 1, 出現検査(R,L). 値の存在する個数を調べる(L,_個数) :- 値の存在する個数を調べる(L,[],_個数). 値の存在する個数を調べる([],L,_個数), length(L,_個数),!. 値の存在する個数を調べる([V|R1],L,_個数) :- \+(var(V)), 値の存在する個数を調べる(R1,[_|L],_個数). 値の存在する個数を調べる([V|R1],L,_個数) :- var(V), 値の存在する個数を調べる(R1,L,_個数). ランダムに値を入力(M,N,_ならび) :- length(_ならび,N), findall(V,( append(_,[_|_],_ならび), V is random(M)), _ならび).