2016-11-30 12 views
1

リストのリスト内の要素のインデックスを見つけるところの要素は常にユニークである:私はこのデータ構造を持っている

[[a,b,c], [d,e,f], [y,z]] 

さて、私は要素のインデックスを取得するための手順を書きたい、私を言います持っている:

indexOf([[a,b,c], [d,e,f], [y,z]], a, H) 

H0です。または:

indexOf([[a,b,c], [d,e,f], [y,z]], f, H) 

H2です。

indexOf_single([X|_],X,0). 
indexOf_single([_|T],X,H) :- indexOf_single(T,X,H1), H is H1 + 1. 

indexOf([T],X,H) :- indexOf_single(T,X,H). 
indexOf([Head|Tail],X,H) :- indexOf_single(Head,X,H),indexOf(Tail,X,H). 

しかし、私はfalseすべての時間を取得しています:

これは私が持っているものです。あなたはそれを解決するための手がかりを私にくれてもらえますか?

+0

何が失敗するのか知っていますか?それはどちらの述語ですか?そして、あなたは 'nth0/3'について知っていますか?あなたが 'indexOf_single/3'を置き換えるために使うことができます。 'nth/3'を持つことも可能です。 'nth(Index1、List、Element)、succ(Index、Index1)'を使います。 –

答えて

2

私はあなたのindexOf/3で2つのエラーを参照してください

indexOf([Head|_],X,H) :- indexOf_single(Head,X,H). 
indexOf([_|Tail],X,H) :- indexOf(Tail,X,H). 

で試してみてください。

(1)2番目の句

​​

にあなたはTailindexOf_single/3経由)HHeadで発見されますようお願いいたします。そして、「要素は常にユニーク」なので、これは不可能です。 Tは、最初の引数の最後のサブリストがある場合は、あなたの最初の句

indexOf([T],X,H) :- indexOf_single(T,X,H). 

(2)あなたはTのみで検索します。

+0

うんうん!どうもありがとう。この変更をどのようにして行ったのか説明してください。 –

+1

@AfshinMehrabani - 回答が改善されました。お役に立てれば。 – max66

関連する問題