11
votes

Comment calculer l'index d'élément dans une liste?

Je commence à jouer avec Prolog, et avec un fond Java, il est vraiment difficile pour moi, alors voici une question idiote:

Comment écrirez-vous un index de prédicat capable de donner l'index d'un élément donné dans une Liste?

Ma première question concerne le prédicat ARITY: Je suppose que cela devrait être 3 tel que: xxx

suis-je raison? Peut-être que cela existe déjà dans des bibliothèques intégrées, mais je veux apprendre à l'écrire. Merci pour votre aide.


3 commentaires

Ressemble à un bon début.


@aschepler oui mais je deviens fou d'avoir ce petit prédicat de travail !!!


C'est en effet un bon exercice lorsque l'apprentissage de Prolog. FYI: Les prédicats du bâtiment pour y parvenir sont NTH0 et nth1 . ( swi-prolog.org/pldoc/... )


3 Réponses :


13
votes

Vous pouvez le faire récursivement: Supposons que l'index à 0 fois (sinon changez simplement le 0 avec 1 sur la première clause) xxx pré>

Si vous voulez seulement trouver la première apparition, vous pouvez Ajoutez une coupe (!) Pour éviter de revenir en arrière. P>

indexOf([Element|_], Element, 0):- !.
indexOf([_|Tail], Element, Index):-
  indexOf(Tail, Element, Index1),
  !,
  Index is Index1+1.


13 commentaires

Merci d'avoir répondu. Puis-je remplacer la première clause avec: indexof ([premier | _], élément, index): - premier == élément, index == 0.?


La réponse est non. Pouvez-vous expliquer pourquoi ?


L'opérateur == n'effectue pas l'unification. Ainsi, il ne peut pas instancer l'index à 0. Il peut être utilisé, toutefois, dans la première comparaison (premier == élément irait bien car dans ce prédicat doit être instancié). Index == 0 échouera lorsque l'index n'est pas instancié.


Ok merci pour cette explication claire. Une autre question, j'ai lu l'opérateur = peut être utilisé pour l'unification. Ainsi, je suppose que le remplacement de la première clause avec: indexof ([premier | _], élément, index): - premier == élément, index = 0 fonctionnera? Confirmez-vous? Je suis au bureau, je vais essayer ceci à la maison ce soir.


Oui, ça marcherait. Notez que l'indexofof ([premier | _], élément, index): - premier == élément, index = 0. est presque identique à l'index de ([premier | _], élément, 0): - premier fichier ==. Dans ce dernier cas, l'unification est effectuée dans la tête du prédicat au lieu du corps. En fait, ce dernier serait identique à l'indexof ([premier | _], élément, index): - index = 0, premier == élément. Donc, l'unification serait effectuée avant la comparaison.


Je pense que la deuxième coupe est inutile. @ Gusbro


Si vous vouliez calculer l'élément dans une liste de listes? Pourrait-il être facilement étendu?


@Andrewcaulfield: Oui, si vous souhaitez obtenir un numéro de liste et de # de l'élément dans cette liste, vous auriez utilisé deux comptoirs et recueille dans chaque subliste.


@gusbro ne cherche pas à obtenir le numéro de la liste. Juste la position d'un élément dans une liste de listes. donc print_position ([[[[[B, C, F], [A, D, G], [H, E]], G, H) retournerait H = 2.


Oui, ce serait facile aussi. J'utiliserais une procédure qui compte sur la liste des listes et pour chaque liste, vous pouvez appeler la procédure de cette réponse. Sinon, il suffit d'émettre un membre (liste, listOfflists), indexof (liste, élément, index)


Que serait le prédicat complet? Je reçois une erreur à ma fin.


Ce serait quelque chose comme ceci: indexofinlistoflists (listOfflists, élément, index): - membre (liste, listOfflists), indexof (liste, élément, index).


Parfait. Merci pour votre aide.



1
votes

Il faut préférer utiliser la récursion de la queue: xxx

Quelques requêtes: xxx

Si vous voulez obtenir tous les index de Un élément dans une liste, vous devriez écrire un autre prédicat pour celui-ci sans la coupe nommée Allindexes de ou quelque chose.


0 commentaires

1
votes

J'ai fait cela dans la notation successeur et c'est assez concis et soigné: xxx

sorties d'échantillons: xxx


0 commentaires