2017-03-07 10 views
2

私はPrologを学んでいます。私はelemindexという述語を使って、elemindex(element, index, list)の形式で、例えばelemindex(1,0,[1,2,3,1]).またはelemindex(3,0,[1,2,3,1]).のように実験していました。機能を失うことなく述語の応答内でs(N)を評価する

によりインスタンス化の制約に、私はこれで終わった:私は?- elemindex(1,N,[1,2,3,1]).を照会しかし、もし、私の例のように、プロローグが応答

elemindex(E, 0, [E|_]). 
elemindex(E, s(M), [_|L]) :- elemindex(E,M,L). 

N = 0 
N = s(s(s(0))) 
yes 

これは確かに取り組んでいるが、はs(s(s(0)))に少なくとも3と表示したいと思います。さらに?- elemindex(E, 3, [1,2,3,4]).のようなクエリを実行することはできませんが、コードをN is M+1に変更すると、第1種のクエリを評価する能力がなくなります。

  1. がどのように私は私の結果で3として表示するs(s(s(0)))を取得することができます。

    だから、私の質問は2倍のですか?

  2. elemindexを実装して、のインデックスをクエリできるようにするにはどうすればよいですか?
+2

をなぜあなたはこのコンテキストで '1'/'秒を使用していますか?あなたは 'N#= M + 1'を試しましたか? (ライブラリ 'clpfd'を使用) – lurker

+0

@lurker'#= 'を使って何をするのか説明できますか?私はプロローグにはとても新しいです。 – AJFarmar

答えて

2

はCLPFDライブラリの一部です。これは整数を「推論する」ために使用します。 is/2演算子は、完全に既知の式を評価するように設計されているため、2番目の引数を完全にバインドしてすぐに評価できるようにする必要があります。 #=/2にはそのような制限はありません。インスタンス化エラーは発生せず、Prologは変数の解決を試みます。 「Prolog clpfd」でGoogle検索を行います。ここで

は、それはあなたのコードで動作する方法は次のとおりです。

elemindex(E, 0, [E|_]). 
elemindex(E, Index, [_|L]) :- 
    Index #= N + 1, 
    N #>= 0, 
    elemindex(E, N, L). 

は、[クエリ:

| ?- elemindex(1,N,[1,2,3,1]). 

N = 0 ? a 

N = 3 

no 
| ?- elemindex(E, 3, [1,2,3,4]). 

E = 4 ? a 

no 
| ?- 
+1

これは、説明のおかげで、動作します。 – AJFarmar

+1

'elemindex(1,1、L)'は終了しませんが、 – false

+1

@false hah good catch、ありがとう! – lurker

関連する問題