2010-10-20 24 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 ...