>>660
% Prolog

ウィルソンの定理による素数判定(X,素数です) :-
  X > 0,
  Y is X - 1,
  階乗保存計算(Y,Z),
  0 is (Z + 1) // X,!.
ウィルソンの定理による素数判定(X,素数ではありません) :-
  X > 0,
  Y is X - 1,
  階乗保存計算(Y,Z),
  not(0 is (Z + 1) // X),!.

階乗保存計算(0,1) :- !.
階乗保存計算(1,1) :- !.
階乗保存計算(N,X) :-
  N2 is N - 1,
  階乗保存計算(N2,Y),
  X is N * Y,
  asserta((階乗保存計算(N,X) :- !)).