エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

「40 - 32 / 2 = 4!」Prolog篇

読んでます。

8クイーンが解けるなら、これも解けるだろう…

…と思ったまではよかったが。

Prologむずいよ。
コードの中でA, B, Cの値を生成すればいいのかもしれないと気がつくまで3、4日かかった。

とりあえず書いた。動いた。コードの検証は後日。

factorial(0, 1).
factorial(X, F) :- X > 0, X1 is X - 1, factorial(X1, F1), F is X * F1.

f_(N) :-
  factorial(N, F),
  Amin is F + 1,
  Amax is F * 2 - 1,
  for(A, Amin, Amax),
  Cmax is A div (A - F),
  for(C, 2, Cmax),
  B is C * (A -F),
  0 =:= (A - B) mod C,
  N =:= (A - B) div C,
  0 =:= B mod C,
  F =:= A - (B div C),
  write('\n'), write(A), write(','), write(B), write(','), write(C), write(','), write(N).

f(N, M) :- for(X, N, M), f_(X).


実行結果。

GNU Prolog 1.4.0
By Daniel Diaz
Copyright (C) 1999-2011 Daniel Diaz
?- f(4, 10).
25,5,5,4 true ? a 30,18,3,4 true 40,32,2,4 true (長いので途中略) 3991669,3991559,11,10 true 4354548,4354488,6,10 true 5443185,5443155,3,10 true 7257580,7257560,2,10 true

7つの言語 7つの世界

7つの言語 7つの世界