I、J、Kの3つの整数を取り、KがIとJの範囲内にある場合はtrueを返し、範囲外の場合はfalseを返すプログラムを作成しようとしています。
もちろんロジックはとても簡単ですが、私はそれを実装するのに十分なPrologの構文を理解していません。
この課題をどのように解決しますか。これは私が現在持っているコードです:
i(10).
j(20).
k(21).
inRange(i, j, k):-
(k > i, k < j).
I、J、Kの3つの整数を取り、KがIとJの範囲内にある場合はtrueを返し、範囲外の場合はfalseを返すプログラムを作成しようとしています。
もちろんロジックはとても簡単ですが、私はそれを実装するのに十分なPrologの構文を理解していません。
この課題をどのように解決しますか。これは私が現在持っているコードです:
i(10).
j(20).
k(21).
inRange(i, j, k):-
(k > i, k < j).
覚えておく必要がある Prolog の構文の最初の規則は、文字で始まるものの最初の文字の大文字と小文字が重要であるということです。他の多くの言語で変数のように見えるものは、実際には Prologではアトムである可能性があります。
識別子が小文字で始まる場合、それは変数ではなく、いわゆるアトムです。変数とは異なり、アトムは定数です。それらはunificationによって他の値にバインドできないため、inRange(i, j, k)
おそらく機能しません。あなたが必要
inRange(I, J, K) :- K > I, K < J.
これで、ロジックが期待どおりに機能します。
:- inRange(0, 10, 5), write(yes).
yes
目標を書きながら
:- inRange(0, 10, -1), write(yes).
:- inRange(0, 10, 11), write(yes).
どちらも失敗します。これはideone の簡単なデモです。
おそらく変数を使用したいと思うでしょう (大文字で始まる必要があります):
in_range(X,Y,Z) :- X < Y, X < Z, Y > Z.
範囲内にあるものをどのように定義するかによって、次のようにすることをお勧めします。
in_range(X,Y,Z) :- X =< Y, X =< Z, Z =< Y.
これら 2 つのバージョンでは、3 つの数値すべてをインスタンス化する必要があります。つまり、次のような質問しかできません。
?- in_range(1,10,4).
true.
だがしかし:
?- in_range(1,10,X).
X=1;
X=2;
...
X=10.
組み込み述語はbetween/3
どうですか?試してみてください:
?- between(1,5,3).
また
?- between(1,5,10).
あるいは:
?- between(1,5,X).