%
% ex82.pl - 「6. 簡単なパズル(?)を解かせる」の2.
%

% gennum1/1 - 一桁の数値生成
gennum1(0).
gennum1(1).
gennum1(2).
gennum1(3).
gennum1(4).
gennum1(5).
gennum1(6).
gennum1(7).
gennum1(8).
gennum1(9).

% AからDまでの数値を生成してから加算し、結果を10と比較する。
% BからDについては生成させる毎に比較し異なる値のみを使用する。
% (生成直後に比較することでバックトラックの回数を減らす。)
sum10(A, B, C, D) :-
    gennum1(A),
    gennum1(B), B \= A,
    gennum1(C), C \= A, C \= B,
    gennum1(D), D \= A, D \= B, D \= C,
    10 is A + B + C + D.

% 一々手でバックトラックを指示するのは面倒なので、自動的にバックトラック
% しながら、画面に表示させる述語も定義しておく。
all_sum10 :-
    sum10(A, B, C, D),
    writeln([A, B, C, D]),
    fail.
all_sum10.
