2017-05-10 1 views
0

Je sais que quelques questions ici sont similaires à celui-ci, mais je suis inexpérimenté et je ne sais pas comment les utiliser et convertir les solutions à mon problème;/Prolog - Travailler avec une liste de listes et un élément dans l'une des sous-listes

J'ai une liste avec des listes à l'intérieur, comme celui-ci: [[5], [4,7], [1,2,7], [2,6,7], [2 , 4,6,7], [2,4,7], [9,8], [3], [1]]

et j'ai besoin de connaître l'indice de, par exemple, le nombre 3. Le Le numéro que j'ai besoin de savoir n'apparaîtra qu'une seule fois sur la liste des listes, c'est une condition préalable pour appeler la fonction. L'indice dont j'ai besoin est, pour le nombre 3, l'indice 9 (commence à 1). J'ai eu ce brouillon d'une fonction:

given_elem_finds_pos(ListOfLists, Element, Pos):- 
    nth1(Pos, ListOfLists, [Element|_]). 

Mais il ne renvoie que le Pos si l'élément est la tête d'une sous-liste. J'ai besoin de savoir comment accéder à l'index de par exemple. le numéro 8.

Alors je l'ai fait un:

given_elem_finds_pos([[H|T]| R], Element, Ind):- 
member(Element, [H|T]), 
Ind1 is Ind + 1, 
given_elem_finds_pos(R, Element, Ind1). 

Mais encore une fois, sans succès .. Quelqu'un peut-il aider? Merci beaucoup!

Répondre

0

Votre deuxième approche va dans la bonne direction. Pensez simplement à ce que vous voulez décrire: Si Element est un élément de [H|T] vous voulez arrêter, par conséquent, pas besoin d'avoir un appel récursif ici. De plus, vous souhaitez retourner l'index actuel, vous avez donc besoin d'un argument supplémentaire (un pour le compteur et un pour l'index final). La clause récursive est nécessaire dans le cas où Element n'est pas un élément de la liste. Voici la clause pour le cas où il est un élément

given_elem_finds_pos([List| R], Element, Solution,Solution):- 
     member(Element, List). 

Comme vous devez ajouter l'argument supplémentaire que vous avez besoin d'un prédicat supplémentaire qui appelle votre prédicat étendu:

given_elem_finds_pos(ListOfLists, Element, Ind):- 
     given_elem_finds_pos(ListOfLists, Element,0, Solution). 

Maintenant, vous ne devez écrire une clause de plus pour given_elem_finds_pos/4, une récursive pour le cas "ce n'est pas un élément". Demandez, si vous avez du mal à écrire cette clause.

+0

Merci pour la réponse rapide! Je travaille sur l'autre clause et essaye de comprendre ce que vous avez fait, donc je ne peux pas dire que tout est fait, mais dites-moi quelque chose: dans la dernière itération, ou la dernière fois que given_elem_finds_pos/4 est appelée, Prolog se retrouve avec un index qui a continué à être augmenté d'un, non? Ou vous ne faites pas cela sur le vôtre? Parce que si vous le faites, cette valeur finale n'est-elle pas la même que Solution? –

+0

Oui, vous avez raison, le compteur augmente et si la sous-liste recherchée est trouvée, le compteur est égal à l'index. C'est pourquoi vous avez besoin de l'argument supplémentaire. La clause stop dans mon code, commençant par 'given_elem_finds_pos ([Liste | R], Elément, Solution, Solution): -', instancie l'index de la solution avec le compteur courant. –

+0

Je l'ai fait et ça marche, merci !! –