我是一名Prolog的初學者,並且有一段我一直試圖實現的代碼。序言詞功能
從本質上講,你進入這裏的字符串中的文字,被該字符串返回與解析出來的話字符串列表空格或感嘆號或逗號等
分離的字符串。
因此,例如,「堆疊,溢出!岩石」。將返回[「堆棧」,「溢出」,「岩石」]
我想使用swi prolog assoc或一些地圖結構來查找邊界字符,但我無法弄清楚。
我將不勝感激任何幫助!
我是一名Prolog的初學者,並且有一段我一直試圖實現的代碼。序言詞功能
從本質上講,你進入這裏的字符串中的文字,被該字符串返回與解析出來的話字符串列表空格或感嘆號或逗號等
分離的字符串。
因此,例如,「堆疊,溢出!岩石」。將返回[「堆棧」,「溢出」,「岩石」]
我想使用swi prolog assoc或一些地圖結構來查找邊界字符,但我無法弄清楚。
我將不勝感激任何幫助!
那些雙引號字符串真的是列表字符代碼。然後一個DCG是合適的方法來處理所述解析:
:- use_module(library(http/dcg_basics), [string//1]).
%% split input on Sep
splitter(Sep, [Chunk|R]) -->
string(Chunk),
( Sep -> !, splitter(Sep, R)
; [], {R = []}
).
Sep
以上可以是文字,或非終端。我們需要這樣的東西
not_in_word --> [C], {\+code_type(C, alpha)}.
有這樣的定義:
?- phrase(splitter(not_in_word, X), "stack,overflow!rocks.").
X = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115], []] .
我們可以擺脫使用刪除空字符串/ 3:
?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."), delete(X, [], Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]] .
編輯我們可以想像的話輕鬆如原子:
?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."),
delete(X, [], Y),
maplist(atom_codes, Z, Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]],
Z = [stack, overflow, rocks] .
注意maplist(atom_codes,Atoms,Codes)中的'output'字位置...
有沒有辦法讓我看到實際的單詞而不是返回的字符代碼?這是可能的,而不必轉換字符代碼? – 2012-08-03 15:56:40
您可以使用格式('〜s',[AnyOfY])或查看編輯的答案。 – CapelliC 2012-08-03 16:12:56
COMP348是它嗎? :P – overscore 2012-08-04 06:35:10