2010-10-20 67 views
4

我想在贏得xp中使用SWI-Prolog。我正試圖理解如何將Prolog中的一個句子分解爲單獨的原子。如何在swi-prolog中分割一個句子

例如:說我有這樣的句子:

「這是一個字符串」
有沒有什麼辦法讓單個詞語來獲取存儲在一個變量?

像:

X =此
Y =是
....
等等。

任何人都可以請解釋這是如何工作的?

謝謝。

回答

-5

?-split(「這是一個字符串」,「」,Out)。

時間= [ 「這個」, 「是」, 「一」, 「字符串」]

+0

拆分未定義 – JPro 2010-10-20 10:46:56

10

我會使用atomic_list_concat/3。見

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

通常是指插入分離器,但因爲統一的Prolog的雙向性的,它也可以用來分割字符串分隔:

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

當然一旦分割完成,你可以玩列表元素L.

+0

非常棒! :-) – ProfVersaggi 2014-01-31 18:49:42

+0

對於SWI-prolog可以使用更新版本'split_string/4'。 http://www.swi-prolog.org/pldoc/man?predicate=split_string/4 'split_string(「Hello,here I am!」,「」,「」,Temp).' – syfantid 2015-06-01 14:03:28

4

我喜歡'pat fats'的答案,但是你必須將你的字符串轉換爲atom:

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

如果您需要直接與字符串的工作,我有這樣的代碼在我的 '裝備庫':

?- 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] . 

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

是一個DCG,必須以這種方式被稱爲

編輯:更多解釋

我忘了解釋它是如何工作的:DCG很好地解釋了@larsman,在this等答案。我引用他

- >,它實際上增加了兩個隱藏的參數。第一個是由語法規則解析的列表;第二個是解析後的「剩下的」。 c(F,X,[])在列表X上調用c以獲得結果F,期望留下[],即解析器應該消耗整個列表X.

這裏我有2個參數,第一個是分隔符,第二個是正在構建的列表。內置字符串// 1來自SWI-Prolog庫(http/dcg_basics)。這是一個非常方便的構建模塊,可以匹配任何回溯的東西。這裏它是在分隔符之前'吃'每個字符串的結尾。完成後,我們可以遞歸...