Prologue de la liste séparée par des virgules de la chaîne
J'ai une liste comme [apple, orange]
et je veux le convertir en une chaîne de caractères comme "apple,orange"
en Prolog. Avez-vous une idée?
Veuillez expliquer pourquoi voulez-vous faire? Voulez-vous jolie impression de la liste? Voulez-vous sérialiser dans un fichier? Et quelle est la nature de la liste d'entrée: il peut contenir d'autres listes ou des termes complexes, il peut contenir des variables et la variable de partage?
OriginalL'auteur selda | 2011-05-04
Vous devez vous connecter pour publier un commentaire.
En SWI-Prolog vous pouvez simplement utiliser
atomic_list_concat/3
etatom_string/2
:OriginalL'auteur Grzegorz Adam Kowalski
En SWI-Prolog vous pouvez utiliser
with_output_to/2
. Ci-dessous deux versions, l'une en utilisantwrite/1
et les autreswriteq/1
. Il n'est pas clair à partir de votre question, ce genre de comportement de votre besoin.Rechercher
with_output_to
dans le SWI-Prolog manuel:help(with_output_to).
L'expérimentation (parce que la documentation est à peu près inutile pour moi) je trouve que si vous venez d'exécuter les deux premières clauses,
List = [apple, 'orange'], with_output_to(codes(Codes), writeq(List))
, il définitCodes
comme une liste de numéros correspondant àList
. La première, 91, doit être le support de caractères; la fuite|
signifie qu'il y a plus de gauche, unshown.format()
puis l'imprime à l'écran, dans certains langue obscure où~s
veut dire ... euh ...OriginalL'auteur Kaarel
si vous utilisez swi-prolog vous pouvez également effectuer les opérations suivantes:
1) utiliser le string_to_list/2 (vous pouvez donner une liste et d'obtenir une chaîne de caractères ou de donner une chaîne et d'obtenir une liste). le problème, c'est qu'il l'habitude d'insérer des virgules de sorte que vous aurez à insérer des virgules entre les éléments de votre liste manuellement; quelque chose comme
de sorte que votre prédicat serait quelque chose comme:
2)vous pouvez utiliser swritef/3 et string_concat/3. swritef/3 fonctionne comme writef/2 mais au lieu d'écrire dans la sortie, il crée une chaîne de caractères avec les données.
vous voulez peut-être faire la queue de la récursivité des optimisations
OriginalL'auteur Thanos Tintinidis
Je suis un Prologue de novice, mais c'est ce que je suis venu avec.
qui donne:
et:
J'ai une question, je veux un prédicat à partir de cette liste. J'ai une liste [pomme,orange]. J'essaie de rendre les fruits(pomme,orange). Pouvez-vous m'aider?
Si vous avez une nouvelle question, puis de publier une nouvelle question, non pas comme un commentaire à une autre réponse. Répondre à cette question bien que déjà: stackoverflow.com/questions/612604/...
OriginalL'auteur Gavin Lock
Désolé, de ne pas avoir assez de rep pour ajouter ce commentaire pour Gavin Verrouillage de la réponse. Gavin solution est bonne si loin que ça va, mais il faut être tordu pour éviter de donner des réponses en double (ou, plutôt, une variation sur la même réponse). Le problème est que une liste avec un seul atome d'unifier deux clauses dans list_codes/2: le deuxième ET le troisième alinéa. (Une liste avec un seul élément a toujours une queue, c'est à dire la liste vide.) Je crois que la deuxième clause de liaison est souhaitée. La troisième clause semble être conçu pour être récursive pour les listes qui ont encore au moins deux éléments. Par conséquent, je recommande la modification de cette clause:
Cela ne unifier lorsque la liste a au moins deux éléments, et les empêcher d'obtenir deux solutions.
OriginalL'auteur Kaitain
term_string (30 char min S. O.)
En dehors de l'explication, s'il vous plaît également envisager d'ajouter un peu de code en exemple pour démontrer l'effet de votre solution.
OriginalL'auteur user10221289