2012-08-02 82 views
2

我是一名Prolog的初學者,並且有一段我一直試圖實現的代碼。序言詞功能

從本質上講,你進入這裏的字符串中的文字,被該字符串返回與解析出來的話字符串列表空格或感嘆號或逗號等

分離的字符串。

因此,例如,「堆疊,溢出!岩石」。將返回[「堆棧」,「溢出」,「岩石」]

我想使用swi prolog assoc或一些地圖結構來查找邊界字符,但我無法弄清楚。

我將不勝感激任何幫助!

+0

COMP348是它嗎? :P – overscore 2012-08-04 06:35:10

回答

4

那些雙引號字符串真的是列表字符代碼。然後一個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'字位置...

+0

有沒有辦法讓我看到實際的單詞而不是返回的字符代碼?這是可能的,而不必轉換字符代碼? – 2012-08-03 15:56:40

+0

您可以使用格式('〜s',[AnyOfY])或查看編輯的答案。 – CapelliC 2012-08-03 16:12:56