2016-10-13 1 views
1

Je fais des problèmes aléatoires pour la pratique et je continue à courir dans le même petit problème avec les listes. Pour une raison quelconque, je continue d'obtenir un symbole de pipe à la fin de la liste quand j'insère/ajoute/modifie la liste. Exemple d'un code tel que le fait que pour moi:Prolog Création d'une liste me donner un hasard | dans la liste.

insertBetween([], E, []). 
insertBetween([X], E, X). 
insertBetween([X|Xs], E, [X, E | Zs]):- insertBetween(Xs, E, Zs). 

J'essaie la commande suivante:

insertBetween([1,2,3], 0, Res). 

qui reviennent comme: Res = [1, 0, 2, 0 | 3].

Pourquoi est-ce que j'obtiens cette réponse quand on s'attend à obtenir Res = [1,0,2,0,3]? Est-ce que je fais mal les cas de base? Depuis quelques semaines, je suis venu à ne pas aimer ce programme lang ... lol

Répondre

1

En plus de @ faux de réponse, même si vous écrivez: insertBetween([X], E, [X]). au lieu de insertBetween([X], E, X). vous obtenez:

?- insertBetween([1,2,3], 0, Res). 
Res = [1, 0, 2, 0, 3] ; 
Res = [1, 0, 2, 0, 3, 0]. 

Ce parce que les deuxième et troisième règles/clauses peuvent à la fois réussir donnant des résultats différents, donc vous avez besoin pour faire la troisième clause diffère de la deuxième comme:

insertBetween([], _, []). 
insertBetween([X], _, [X]). 
insertBetween([X,Y|Xs], E, [X, E | Zs]):- insertBetween([Y|Xs], E, Zs). 

Cela donne:

?- insertBetween([1,2,3], 0, Res). 
Res = [1, 0, 2, 0, 3] ; 
false. 

Notez que la troisième clause fonctionne si la liste a au moins deux éléments mais quand elle n'en a qu'une, la deuxième clause réussit. Aussi quand vous avez par exemple: insertBetween([], E, []). où E n'est pas utilisé il est préférable de le remplacer par insertBetween([], _, []).

+0

Hm, Que _ se débarrasser aussi de ces avertissements ennuyeux je continue à obtenir. Donc, quand vous "n'utilisez pas" les variables dans vos clauses, nous devrions utiliser _? – Leruce

+0

Lorsqu'une variable n'est pas utilisée (variable sinlgeton) ce qui signifie que vous ne vous souciez pas de sa valeur et dans ce cas vous utilisez '_' qui est une variable anonyme et qui s'unifie avec n'importe quoi. Plus précisément dans votre cas: insertBetween ([], _, []). signifie que si la première liste est [], alors quelle que soit la variable du milieu, alors le troisième argument devrait être vide list []. – coder

+0

Ah, merci d'avoir clarifié cela. – Leruce

1
insertBetween([X], E, X). 
      ^ ^

Alors X est un élément d'une liste et une liste.