我想在贏得xp中使用SWI-Prolog。我正試圖理解如何將Prolog中的一個句子分解爲單獨的原子。如何在swi-prolog中分割一個句子
例如:說我有這樣的句子:
「這是一個字符串」
有沒有什麼辦法讓單個詞語來獲取存儲在一個變量?
像:
X =此
Y =是
....
等等。
任何人都可以請解釋這是如何工作的?
謝謝。
我想在贏得xp中使用SWI-Prolog。我正試圖理解如何將Prolog中的一個句子分解爲單獨的原子。如何在swi-prolog中分割一個句子
例如:說我有這樣的句子:
「這是一個字符串」
有沒有什麼辦法讓單個詞語來獲取存儲在一個變量?
像:
X =此
Y =是
....
等等。
任何人都可以請解釋這是如何工作的?
謝謝。
?-split(「這是一個字符串」,「」,Out)。
時間= [ 「這個」, 「是」, 「一」, 「字符串」]
我會使用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.
非常棒! :-) – ProfVersaggi 2014-01-31 18:49:42
對於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
我喜歡'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)。這是一個非常方便的構建模塊,可以匹配任何回溯的東西。這裏它是在分隔符或之前'吃'每個字符串的結尾。完成後,我們可以遞歸...
拆分未定義 – JPro 2010-10-20 10:46:56