Prologで開始番号から終了番号までのシーケンスを見つけるにはどうすればよいですか。私の関数は見えるはずです
findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6
Prologで開始番号から終了番号までのシーケンスを見つけるにはどうすればよいですか。私の関数は見えるはずです
findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6
ここで簡単な手順
findSequence(N, N, N) :- !.
findSequence(S, E, N) :-
S < E, (N = S ; T is S + 1, findSequence(T, E, N)).
findSequence(S, E, N) :-
S > E, (N = S ; T is S - 1, findSequence(T, E, N)).
実際に使用するには、 /3の間が機能するかどうかを確認する必要があります。
開始値 (-4) から終了値 (-6) までの値を (リストに) 累積する再帰述語の使用を検討してください。
これは、あなたが尋ねていることは特に難しいことではありませんが、あなたが何を望んでいるのかを理解するのに多くの時間を費やしたほど回りくどい方法でそれを尋ねることができたという面白いケースです. シーケンス(つまりリスト)はまったく必要ありません。連続した回答が必要です。そして、自然数だけでなく、すべての整数で動作するようにしたい-これはあなたの例では暗黙的ですが、述べられていません. また、-4 は -6 より大きいため、この例は単純なソリューションでは機能しません。これは、この述語が通常どのように記述されるかの反対です。
これらすべてに対処するために、私が確信している最も簡単なことは、ライブラリが必要なことですclpfd
:
:- use_module(library(clpfd)).
いくつかのヘルパー述語が必要です。
min(X, Y, Z) :- X < Y -> Z = X ; Z = Y.
max(X, Y, Z) :- X < Y -> Z = Y ; Z = X.
これらは最小値と最大値を見つけるだけです。通常はそれぞれ 2 行で記述しますが、これはより便利です。今解決策:
findSequence(X, Y, Z) :-
min(X, Y, Low),
max(X, Y, High),
Z in Low..High,
label([Z]).
これにより、ユースケースと明らかなユースケースが処理されます。
これはうまくいくはずです。これは、From<=To を考慮に入れています。確認したい場合は、もう少し複雑に書くことができます
findSequence(X,X,[X]):-!.
findSequence(From,To,[From|Rest]):-SuccFrom is From +1, findSequence(SuccFrom ,To, Rest).
これはリストを返します。
?-findSequence(1,3,List).
List=[1,2,3].
yes