2016-11-30 7 views
1

ich diese Datenstruktur haben, wo die Elemente sind immer einzigartig:Finden der Index des Elements in einer Liste von Listen

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

Nun, ich möchte ein Verfahren schreiben, den Index eines Elements zu erhalten, sage ich haben:

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

und H ist 0. Oder:

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

und H ist 2.

Das ist, was ich habe:

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). 

Aber ich bin immer false die ganze Zeit. Könnten Sie mir bitte Hinweise geben, um es zu lösen?

+0

Wissen Sie, was scheitert? Welches der beiden Prädikate ist das? Und kennst du 'nth0/3'? Sie können es verwenden, um Ihr 'indexOf_single/3' zu ersetzen, wenn Sie eine Prolog-Implementierung verwenden, die es enthält. Es ist auch möglich, dass es "nth/3" hat; Verwenden Sie dann 'nth (Index1, Liste, Element), succ (Index, Index1)'. –

Antwort

2

Versuchen mit

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

ich in Ihrem indexOf/3 zwei Fehler zu sehen.

(1) in der zweiten Klausel

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

Sie darum bitten, dass H im Head (via indexOf_single/3) und im Tail gefunden wird. Und das ist unmöglich, wenn "die Elemente immer einzigartig sind".

(2) in der ersten Klausel

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

suchen Sie in Tnur wenn T die letzte Unterliste des ersten Arguments ist.

+0

yeah funktioniert! Danke vielmals. Könnten Sie bitte erklären, wie Sie diese Änderung vorgenommen haben? –

+1

@AfshinMehrabani - Antwort verbessert; hoffe das hilft. – max66

Verwandte Themen