1 から 100 までの完全数をすべて生成するにはどうすればよいですか?
完全数は、その固有約数の合計に等しい正の整数です。たとえば、6(=1+2+3) は完全数です。
1 から 100 までの完全数をすべて生成するにはどうすればよいですか?
完全数は、その固有約数の合計に等しい正の整数です。たとえば、6(=1+2+3) は完全数です。
ですから、フランクはプロローグで答えを探しているのではないかと思います。はい、かなり宿題の匂いがします...
楽しみのために、私は自分の答えを書くことにしました。50行くらいかかりました。
これが私の述語がどのように見えるかの概要です。Prolog の考え方を理解するのに役立つかもしれません。
is_divisor(+Num,+Factor)
divisors(+Num,-Factors)
divisors(+Num,+N,-Factors)
sum(+List,-Total)
sum(+List,+Sofar,-Total)
is_perfect(+N)
perfect(+N,-List)
+ と - は実際にはパラメーター名の一部ではありません。それらは、作成者がインスタンス化されることを期待するものに関するドキュメントの手がかりです。(NB) "+Foo" は、述語が呼び出されたときに Foo が値を持つことを期待することを意味します。「-Foo」は、述語が呼び出されたときに Foo が変数であり、終了するまでに値を与えることを期待することを意味します。(そのように考えるのに役立つ場合は、入力と出力のようなものです)
sum/2 と sum/3 のような述語のペアを見ると、sum/2 は sum/3 のラッパーのようなもので、アキュムレータのようなことをしている可能性があります。
私はそれらをきれいに印刷することを気にしませんでした。Prolog コマンド ラインで直接クエリを実行できます。
?- perfect(100,L).
L = [28, 6] ;
fail.
Prolog の述語について私が見つけたもう 1 つの役立つ点は、一般に 2 種類あるということです。1 つは、何かが真かどうかを単純にチェックするものです。この種の述語では、他のすべてが失敗することを望みます。これらは再帰的である必要はありません。
他の人は、(数値またはリストの) 範囲を通過し、0 または [] であっても常に結果を返したいと思うでしょう。これらのタイプの述語については、再帰を使用し、基本ケースについて考える必要があります。
HTH。
注意: これは「モード」と呼ばれ、実際に指定することができ、コンパイラ/インタープリタがそれらを強制しますが、私は個人的にドキュメントでそれらを使用しています。また、Prolog モードに関する情報を含むページを見つけようとしましたが、適切なリンクが見つかりません。:(