0

ちょっとした質問があります。自然数から別の自然数を数える述語を作成する必要があります。2番目の間隔が最初の間隔よりも大きいというチェックも実装する必要があります。しかし、途中で行き詰まりました。

これが私のコードです(SWI-PROLOG)

count(O, _, O).
count(A, B, C) :- count(A, B, D), C is D+1, C =< B.

C=1, C=2, C=3, C=4入力すると結果が得られるので、うまく機能しますがcount(1, 4, C).、最後にスタックオーバーフローでエラーが発生します。

問題は、どうすればそれを止めることができるかです。私はほとんどすべてを試しました。=(

ご返信ありがとうございます!

4

3 に答える 3

3

SWI-Prolog にはそのためのビルトインがあります...

?- help(between).
between(+Low, +High, ?Value)
    Low  and High are  integers, High >=Low.   If  Value is an  integer,
    Low=< Value=< High.   When Value  is a  variable it is  successively
    bound  to  all integers  between  Low and  High.    If High  is  inf
    or  infinite between/3 is  true iff Value>= Low,  a feature that  is
    particularly  interesting  for generating  integers from  a  certain
    value.

true.

?- between(1, 4, Value).
Value = 1 ;
Value = 2 ;
Value = 3 ;
Value = 4.

?- 
于 2010-10-19T13:48:18.847 に答える
0

これ

count(A, B, C) :- count(A, B, D), ...

無限再帰を引き起こします。

次のように、述語を並べ替えるだけです。

count(A, B, A) :- A =< B.
count(A, B, C) :- A < B, A2 is A+1, count(A2, B, C).
于 2010-10-19T12:50:49.343 に答える