あなたのプログラムには多くの問題があります。まず、3 + 2
Prolog は、他の言語とは異なり、結果を計算しません。明示的に計算を実行し、計算の結果を predicate によって変数にバインドするように要求する必要があります。is
たとえば、ルールの末尾の残りの部分で使用されるようにバインドされます。X is 3 + 2, ...
X
5
第二に、書き込みとは「再度append(First, Result, Result)
追加First
して取得する」ことを意味します。リストに何かを追加すると、開始したリストよりも長いリストが取得されるため、 が空のリストでない限り、常に失敗します (読み取り: Produce )。andの 2 つの sを区別するのに明らかに失敗しました- それらは実際には同じではありません。もリストに適用されることに注意してください。したがって、およびはすべて、リストまたはリストにインスタンス化できる用語でなければなりません。さもないと失敗します。は常に数字であるため、まさにあなたのケースです-間違いなくリストではなく、そのメンバーです。したがって、使用してはならない: リストの構築と統合を使用するResult
Result
false
First
Result
append
count
append(A, B, C)
A
B
C
First
append
=
リストに要素を追加し、得られた結果を変数にバインドしますX = [Element | List]
。
最後に、上記のすべてが正しかったとしても、帰納法の基本ケースを定義していないため、述語は失敗します。言い換えれば、述語がいつ答えるべき[]
か? これは、CapelliC が述べているように、次の場合に発生する必要があります。First > Last
その場合、範囲は空であり、Result
またそうである必要があります。foo(X, Y) :- X >= 0, Y is X + 1.
あなたのプログラムでは、これが起こると、述語は明らかに失敗します ( を書くとき、これはX
がゼロ未満のときはいつでも失敗することを意味することに注意してください)。再帰の基本ケースである空の範囲であるため、述語の評価は遅かれ早かれそこで終了するため、常に失敗します。
最後に、次のように書く必要があります。
ints(First, Last, Interval) :- First > Last -> Interval = [] ;
NFirst is First + 1, ints(NFirst, Last, NInterval), Interval = [First | NInterval].
(述語と変数により宣言的な名前を付けました)。もちろん、この述語は、数値に完全にインスタンス化された First と Last で呼び出された場合にのみ機能します (逆にすることはできません)。