2010-10-20 5 views
4

J'essaie mes mains sur SWI-Prolog dans win xp. J'essaie de comprendre comment diviser une phrase en Prolog en atomes séparés.comment diviser une phrase en swi-prolog

Ex: Dire que j'ai une phrase comme ceci:

« ceci est une chaîne »
Est-il possible d'obtenir des mots individuels sont stockés dans une variable?

comme:

X = ce

est Y = ....
et ainsi de suite.

Quelqu'un peut-il expliquer s'il vous plaît comment cela fonctionne?

Merci.

Répondre

-5

? -split ("ceci est une chaîne", "", Out).

Out = [ "ce", "est", "a", "string"]

+0

divisé en non défini – JPro

10

J'utiliser atomic_list_concat/3. Voir

http://www.swi-prolog.org/pldoc/man?predicate=atomic_list_concat%2F3

Normalement, il est destiné à insérer un séparateur, mais à cause de la bidirectionnalité de Prolog d'unification, il peut également être utilisé pour découper une chaîne donné le séparateur:

atomic_list_concat(L,' ', 'This is a string'). 
L = ['This',is,a,string] 

Bien sûr Une fois la division terminée, vous pouvez jouer avec les éléments de la liste L.

+0

Simply Awesome! :-) – ProfVersaggi

+0

Pour la version SWI-prolog plus récente, split_string/4' peut être utilisé. http://www.swi-prolog.org/pldoc/man?predicate=split_string/4 'split_string (" Bonjour, je suis ici! "," "," ", Temp) .' – syfantid

4

J'aime la réponse de 'pat fats', mais vous devez convertir votre chaîne en atome avant:

..., atom_codes(Atom, String), atomic_list_concat(L, ' ', Atom), ...

Si vous avez besoin de travailler directement avec les chaînes, j'ai ce code dans mon arsenal ':

%% split input on Sep 
% 
% minimal implementation 
% 
splitter(Sep, [Chunk|R]) --> 
    string(Chunk), 
    ( Sep -> !, splitter(Sep, R) 
    ; [], {R = []} 
    ). 

étant un DCG, doit être appelée ainsi:

?- phrase(splitter(" ", L), "this is a string"), maplist(atom_codes, As, L). 
L = [[116, 104, 105, 115], [105, 115], [97], [115, 116, 114, 105, 110|...]], 
As = [this, is, a, string] . 

modifier: plus d'explications

J'ai oublié d'expliquer comment cela fonctionne: DCG sont bien expliqués par @larsman, en this autre réponse. Je le cite

->, ce qui lui ajoute deux arguments cachés. Le premier d'entre eux est une liste à analyser par la règle de grammaire; la seconde est "ce qui reste" après l'analyse. c (F, X, []) appelle c sur la liste X pour obtenir un résultat F, attendre [] à gauche, à savoir l'analyseur doit consommer toute la liste X.

Ici, j'ai 2 arguments, le premier est le séparateur, le second la liste en cours de construction. La chaîne intégrée // 1 provient de la bibliothèque SWI-Prolog (http/dcg_basics). C'est un bloc de construction très pratique, qui correspond littéralement à quoi que ce soit en faisant marche arrière.Ici, il «mange» chaque caractère devant le séparateur ou la fin de la chaîne. Après avoir fait cela, nous pouvons recurse ...

Questions connexes