2012-05-10 7 views
3

Prologで考えるのが難しいです。このステートメントについて誤っているもの:Prologでのリストと再帰の理解

numberList([], 0). 
numberList([H|T], Limit) :- 
    H is Limit, 
    numberList(T, Limit - 1). 

私は

?- numberList(X,Limit). 

X = [100, 99, 98, ..., 1].をもたらすであろう、すなわち、限界のために与えられた値のための唯一の解決策として

?- numberList(X, 100). 

[Limit, Limit-1 ... 1]を決定したいと思います。

私の推測では、これが機能しないために私の理解にはかなり間違ったことがあります。私は自分がしようとしていることに対する解決策を必ずしも求めているわけではありません。なぜ私の最初の試みが間違っているのか理解したいだけです。

+0

短い答え: '? - A-1 = 0'は失敗します。 '? - A-1 is 0 'も失敗する。あなたは何をしたいのですか?長さ(X、5)、X = [5 | _T]、(_T、[_]、_ Z)、maplist(succ、_Z、X) –

答えて

3

二つの主要な問題ここに潜んあります

1 - あなたはトラブルが右の場所で

2-統一し、算術演算を取得しているあなたは、あなたの入力十分

備考をチェックしていないが、約1-を使用して算術演算を実行します。ここでは、たとえば、1Limitに減算します。 (is)/2は、既に評価された算術式に変数を統合することはできますが、使用すべきではありません。 (=)/2を推奨します(統一)。

備考オペレータが正しくなっても、プログラムのループが発生しても2になることがあります。それについては後で詳しく説明します。

あなたは正しい方法であるので、ここでは、自分だけアップ演算子を切り替えることによって多くを得ることはありません。ここで

numberList([], 0). 
numberList([Limit|T], Limit) :- 
    NewLimit is Limit - 1, 
    numberList(T, NewLimit). 

あなたは、第二句の頭の中で、私は暗黙的に統一を使用することを別の方法を見ることができます

numberList([], 0). 
numberList([H|T], Limit) :- 
    H = Limit, 
    NewLimit is Limit - 1, 
    numberList(T, NewLimit). 

しかし、今、あなたがこのプログラムを試すことで見ることができたとして、それが正しい解決策を見つけていますが;と別の1のために頼めばループ:それを置くためには、次のです。

初心者の目には理由が分かりにくいかもしれません.Prologが成功して解決策を返すときは、実行中に残った選択肢を調べるだけで新しいものを見つけることができます。ここで唯一の選択肢は、Limit0の場合です。したがって、その場合は最初の節ではなく2番目の節を試して、NegativeInfinityに達するまでループします。残念ながら、そこに着くにはかなり時間がかかるので、前にあふれています。この問題を解決するには、が最初の句にカットを追加するか、またはそれよりも優れていることを指定して、2番目の句にガードを追加します。あなた自身がそれをやっているのかどうか尋ねなさい!

+0

これは本当に助けになりました、ありがとうございます。 –

+0

お困りのときは、もう一度質問を投稿してください。 p – m09

+2

まあ、私はいくつかの例を読んで、ちょっと、これはあなたの母がそれを行うことができるように直感的だと思われた...私はほとんど彼女に尋ねなければならなかった。 –

0

"Limit - 1"はC言語などの関数呼び出しと考えられています。それはPrologに「減算関数を見つけ、それをLimit-variableと1で呼び出す」ように求めている。関数の呼び出し結果として "Limit - 1"を理解するようPrologに依頼していますが、Prologは複合項減算(Limit、1)として "Limit - 1"を理解しています。 Hは限界です "これは関数呼び出しとも考えられます

Prologには関数(???)がありません。私はC-peopleの大きな障害であると思います。関数の代わりに(Cのように、数学の場合と同様に)、Prologは(述語論理のように、一次など)

関数は、マイクロプロセッサーを起動するコマンドです。代わりに、述語はマイクロプロセッサにデータを「マイクロプロセッサの目で見る」ように提示し、データをマイクロプロセッサに提示して認識させる。

述語(Predicate)世界の一部を記述し、その世界のオブジェクトとその関係を検証しようとするマイクロプロセッサ間の関係を記述します。マイクロプロセッサーは、それらの関係が実際にその知識に存在することを証明しようとします。それらの関係はその知識の中に何度も存在することができるので、マイクロプロセッサは複数の結果を返すことができる(別名非決定論)

Prologは素晴らしいプログラミング言語であり、おそらく私は素晴らしい記述言語、素晴らしいパターン認識言語、 /控除言語(単純な推論/控除、それは "人工知能"、デジタル電子論理ゲートのような推論/控除の一種ではない)。以前はVisual Studioプログラマーとして熱心でしたが、私は数年前にPrologを研究しました。

C言語などはCommanding用であり、Prolog言語などは記述用です。

関連する問題