0

現在、最初と最後の数字を指定して整数をリストに出力する単純な関数を作成しようとしています。

たとえば、関数呼び出し: count(3,7,Z) は "Z = [3,4,5,6,7]" を出力します。

これまでの私の試みは次のとおりです。

count(First,Last,Result):-
  First <= Last,
  append(First,Result,Result),
  count(First+1,Last,Result).

私は正確に何を間違っていますか?First が last 以下である限り、シーケンスは Result List に追加され続けるという考え方です。

前もって感謝します!私はかなり長い間これと戦ってきました!

4

2 に答える 2

1

1行ずつ:

  1. count(First,Last,Result):-

    悪いスタイル: 名前は別の機能を示唆しています

  2. First <= Last,

    「以下」演算子は =<

  3. append(First,Result,Result),

    INT,LIST,LIST を渡していますが、append/3 にはシグネチャ LIST,LIST,LIST があり、値の更新が必要ですが、Prolog の変数は「不変」です。そのような呼び出しは、Result が変更されない場合にのみ成功します。

  4. count(First+1,Last,Result).

    算術式は明示的に評価する必要があります。ここでは、構造体 +(First,1) を渡します。

また、テスト (修正後) が失敗する場合に必要な動作をコーディングすることもできません。どうFirst>Lastですか?

于 2012-11-30T07:41:07.153 に答える
0

あなたのプログラムには多くの問題があります。まず、3 + 2Prolog は、他の言語とは異なり、結果を計算しません。明示的に計算を実行し、計算の結果を predicate によって変数にバインドするように要求する必要があります。isたとえば、ルールの末尾の残りの部分で使用されるようにバインドされます。X is 3 + 2, ...X5

第二に、書き込みとは「再度append(First, Result, Result)追加Firstして取得する」ことを意味します。リストに何かを追加すると、開始したリストよりも長いリストが取得されるため、 が空のリストでない限り、常に失敗します (読み取り: Produce )。andの 2 つの sを区別するのに明らかに失敗しました- それらは実際には同じではありません。もリストに適用されることに注意してください。したがって、およびはすべて、リストまたはリストにインスタンス化できる用語でなければなりません。さもないと失敗します。は常に数字であるため、まさにあなたのケースです-間違いなくリストではなく、そのメンバーです。したがって、使用してはならない: リストの構築と統合を使用するResultResultfalseFirstResultappendcountappend(A, B, C)ABCFirstappend=リストに要素を追加し、得られた結果を変数にバインドします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 で呼び出された場合にのみ機能します (逆にすることはできません)。

于 2012-11-30T14:55:27.420 に答える