Prolog で、数値 S が false (例: square(3)) または true (例: square(4)) を返す整数の 2 乗であるかどうかをテストする規則 square(S) を作成する必要があります。0 から M までのすべての整数を生成するルールを既に使用しました。
isInteger(X,M) :- between(0,M,X).
このジェネレーターを使用して、規則 square(S) を作成する必要があります。どうすればいいですか?ありがとう
Prolog で、数値 S が false (例: square(3)) または true (例: square(4)) を返す整数の 2 乗であるかどうかをテストする規則 square(S) を作成する必要があります。0 から M までのすべての整数を生成するルールを既に使用しました。
isInteger(X,M) :- between(0,M,X).
このジェネレーターを使用して、規則 square(S) を作成する必要があります。どうすればいいですか?ありがとう
これはおそらく宿題の解決策としては機能しませんが、ECLiPSe CLP Prologで制約ロジック プログラミングを使用してそれを行う多くの方法の 1 つを次に示します。
:- lib(gfd).
square(S) :-
sqr(_) #= S.
つまり、S が整数であり、他の値 (値は気にしないので、「破棄」変数を使用します_
) の場合、S は 2 乗であり、2 乗すると S に等しくなります。
最新の Prolog システムはすべて制約ロジック プログラミングをサポートしており、コードは上記のようになります。
自分のやり方で解決するには、S が生成された整数をそれ自体で掛けた積であるかどうかを確認するだけです。したがって、次のようにすることができます。
isInteger(X,M) :- between(0,M,X).
square(N) :-
isInteger(X, N),
N is X * X.
SWI-Prologの算術関数を使用して、別の可能な解決策を思いつきましたsqrt
が、もっと洗練されたものがあるに違いないと思います。
私は当初、それが次のように単純であると予想していましたがX is sqrt(4), integer(X).
、これは動作しません (少なくとも SWI-Prolog 7.1.4 では機能しませX
ん) 2.0
。integer(2.0)
番号の)。しかし、これは機能します:
square_of_integer(N) :-
Int is rationalize(sqrt(N)),
integer(Int).
これは、最初に N を有理数として表現することに依存します (SWI-Prolog では、「複合項 rdiv(N,M)」で表されます)。2 is rationalize(2.0)
、つまり、有理化はラウンド数の整数に評価されます。