liste de longueur, l'insertion de l'élément
Je suis en train d'écrire un programme en Prolog, qui insère un élément dans une certaine position, si par exemple la
?- ins(a, [1,2,3,4,5], 3, X).
X = [1,2,a,3,4,5].
J'ai le code suivant:
ins(X,[H|T],P,OUT) :-
length([T3],P),
concatenate(X,[H],T),
ins(...).
Le problème est qu'il est l'insertion d'élément X
dans l'index à partir de l'arrière (je sais même pas où est le problème -> le length([T3],P)
qui est évidemment la longueur de la liste à partir de l'arrière pas de la tête) . J'essayais de me souvenir combien éléments n'ai-je couper et insérer X
lorsque le "nombre de couper des éléments" = P
, mais je ne peux pas vraiment écrire que dans le Prologue. Des idées?
OriginalL'auteur Johnzzz | 2012-04-08
Vous devez vous connecter pour publier un commentaire.
Le prédicat échoue si Pos = 0 ou Pos - > longueur(Liste) + 1
OriginalL'auteur Alexander Serebrenik
Commençons ce que vous voulez ici. Par exemple, vous pourriez dire: "je veux partager mon entrée
List
aprèsPosition - 1
éléments pour que je puisse insérer un nouvel élément".Une traduction directe avec
append/3
(DCG serait mieux d'ailleurs):Ou vous pourriez dire: "je veux aller à travers les éléments de mon
List
Position - 1
fois sans rien toucher, puis insérezElement
et puis ne pas toucher quoi que ce soit de nouveau".Cette fois le direct traduction serait:
vous pourriez aussi de l'état: "Mon entrée
List
une liste égal à monResult
, sauf qu'il n'a pas monElement
commePosition
élément th." et de réaliser que si vous utilisez swi-prolog, un prédicat résout instantanément:Ligne de fond est: état de ce que le problème est clairement et que la solution doit apparaître dans des termes simples.
OriginalL'auteur m09
TL;DR: Pour insérer un élément
E
à la positionI1
dans la listeEs0
, nous n'avons pas besoin d'écrire de code récursif.Au lieu de cela, nous pouvons déléguer le travail (et les inquiétudes sur la droite, trop!) d'auxiliaire polyvalent des prédicats, qui font partie de la Prologue prologue. Pour définir
ins_/4
nous écrire:Noter que
maplist(any_thing, Es, [_|Es0])
est équivalent àsame_length(Es, [_|Es0])
.Exemples de requêtes1,2,3 de l'utilisation de GNU Prolog version 1.4.4 (64 bits):
N'oublions pas le plus général requête!
Juste l'énumération de toutes les solutions, OK!
EDIT:
J'ai répété la plus générale d'une requête avec
ins3/4
tel que définipar @m09 dans sa réponse sur SWI-Prolog 7.3.11 et SICStus Prolog 4.3.2 (tous deux disposent de la bibliothèque de prédicat
nth1/4
).J'ai été surpris de voir les implémentations sous-jacentes de
nth1/4
présentent des différences procédurales la sémantique (w.r.t. "juste énumération"). Voyez par vous-même!leNote de bas de page 1: Tous les exemples de requêtes indiqué ci-dessus résilier universellement.
leNote de bas de page 2: La réponse donnée par le GNU Prolog toplevel ont été assez-imprimé un peu.
leNote de bas de page 3: Le code présenté ci-dessus est utilisé est-à -, aucune autre bibliothèque prédicats sont nécessaires.
OriginalL'auteur repeat
La requête
?- ins_(a,[1,2,3,4,5],3,[1,2,a,3,4,5]).
échoue, il doit réussir. Otoh, que la requête?- ins_(a,[1,2,3,4,5],3,[1,2,a,4,5]).
réussit, elle doit échouer. Pour corriger le bug, vous devez supprimer exactement 4 personnages:)OriginalL'auteur 尾崎隆大