% 見たらPrologの話がふたつ続いている。うれしくなって、図に乗って。

ピタゴラス数ならび(_要素値上限,_ピタゴラス数ならび) :-
    findall([_x,_y,_z],(
            ピタゴラス数(_要素値上限,_x,_y,_z)),
        _ピタゴラス数ならび).

ピタゴラス数(_要素値上限,_x,_y,_z) :-
    '1から_要素値上限までの整数リストを生成'(_要素値上限,L),
    組合せ(L,3,[X,Y,_z]),
    'X,Y,を三角形の短辺、_zを長辺だとみなすことができる'(X,Y,_z),
    ピタゴラスの定理を適用する(X,Y,_z),
    短辺はひっくり返すことも可能(X,Y,_x,_y).

'1から_要素値上限までの整数リストを生成'(_要素値上限,L) :-
    findall(N,for(1,N,_要素値上限),L).

'X,Y,を三角形の短辺、_zを長辺だとみなすことができる'(X,Y,_z) :-
    _z > X,
    _z > Y,
    _z < X + Y.

ピタゴラスの定理を適用する(X,Y,Z) :-
    Z * Z =:= X * X + Y * Y.

短辺はひっくり返すことも可能(_x,_y,_x,_y).
短辺はひっくり返すことも可能(_y,_x,_x,_y).