このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/312 
#  [1] 授業単元: Introduction to C++ 
#  [2] 問題文: ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントするプログラムを書きなさい 
#  (元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます) 
#  Write a program that asks user to enter a size, N. (The maximum is 100000). Write a 
#  function that generates random numbers in range of 1 ~ 100 and fill an array of size N. 
#  You also need to count how many 1’s, 2’s, 3’s, 
#  4’s, 5’s, …, 100’s. If the random number function does it job perfectly, the distribution to 
#  each number should be equal. But they might be slightly off. 
#   
ライン([A,B,C,2],[2,E,F,G],[G,H,B,1],[1,C,E,3]).

'空いている○の中に4~12の数字を入れ、5つある線上の合計が等しくなるようにした場合、あまる数字は何と何か?なお、同じ数字は使えません。'(_あまる数字ならび) :-
      ライン(L1,L2,L3,L4),
      flat([L1,L2,L3,L4],L),
      未知数はいくつあるか(L,[],_重複しない変数ならび,_未知数の数),
      findall(M,for(4,M,12),_候補数値ならび),
      順列(_候補数値ならび,_未知数の数,_重複しない変数ならび),
      加算(L1,X),加算(L2,X),加算(L3,X),加算(L4,X),
      差集合(_候補数値ならび,VL,_あまる数字ならび).

未知数はいくつあるか([],L,L,N) :- length(L,N),!.
未知数はいくつあるか([V|R],L,VL,X) :-
      var(V),
      \+memberV(V,L),
      未知数はいくつあるか(R,[V|L],VL,X),!.
未知数はいくつあるか([V|R],L,VL,X) :-
      var(V),
      memberV(V,L),
      未知数はいくつあるか(R,L,VL,X),!.
未知数はいくつあるか([_|R],L,VL,X) :-
      未知数はいくつあるか(R,L,VL,X),!.

memberV(V1,[V2|R]) :- V1==V2,!.
memberV(V,[_|R]) :- memberV(V,R).