from_to/3
を実装するように練習していましたが、ここでは最初の2つの引数として2つの数値を指定し、結果としてそれらの間のすべてのリストを提供します。たとえば、はR=[1,2,3,4,5]
となります。それは5 3のリストを返すクエリfromto(3,8,R)
でなぜこれらの同様のプログラムは異なる成果をもたらしますか?
fromto(N, O, []):-
N >= O.
fromto(N, O, [N|TailResult]):-
O > N,
O1 is O-1,
fromto(N, O1, TailResult).
:
は、私は次のプログラムを書きました。良くない。それを処理するための 正しい方法は次のようになります。from_to(N, O, []) :-
N > O.
from_to(N, O, [N|TailResult]) :-
N =< O,
N1 is N + 1,
from_to(N1, O, TailResult).
意図したとおりこれはlist 3,4,5,6,7,8
を与えます。
私の質問はこれがどのように機能するかです。プログラムは、私がOを使って上から下に作業し、正しいものがNに追加することによって上向きに働くという点だけが異なります。しかし、結果は全く異なります。 これを引き起こす原因を知っている人はいますか?
'append/3'を使用する代わりに、[tag:dcg] -notationを使用して2つのアプローチを定式化することがより洞察になります。 – false
@falseあなたは右にdcgソリューションが追加されています。 – coder