2013-04-01 71 views
2

我正在開展一個小項目,以傾斜序言。我現在想要做的是,給一個句子,返回一個單詞列表。所以,我正在接收一個字符數組,例如「高點和低點」,並試圖將其分解爲「高點」和「低點」。我使用的是字符數組,因爲我想用自己的語言來玩,而且我認爲字符串不會爲此工作。如何在prolog中分解一個列表,給定一個關鍵點?

這是我的代碼。

get_first_word([], _, []):- 
    !. 
get_first_word(X, Pivot, Input):- 
    append(X, [Pivot|_], Input), 
    !. 

split_at([],_). 
split_at(Input, Pivot):- 
    get_first_word(X, Pivot, Input), 
    writef(X), 
    append(X, Y, Input), 
    split_at(Y, Pivot). 

我得到的問題是,這變成了一個無限循環。最終它會傳遞自己的空輸入,而我的基本案例寫得不夠好來處理這個問題。我該如何解決?

+0

在您計劃使用SWI-Prolog的情況下,您可能需要使用原子爲代表的單詞和句子。然後,您可以使用內置函數來分析和構建原子(http://www.swi-prolog.org/pldoc/doc_for?object=section(2,'4.21',swi('/doc/Manual/) ),例如'atomic_list_concat/3',它基本上完成了你對原子的描述。 – 2013-04-01 08:36:27

+0

我正在嘗試製作一個簡單的翻譯腳本,我需要玩很多單詞和單詞部分。我能用SWIProlog「裝配」字符串嗎? – UrhoKarila

+0

在下面看到我的回答 – 2013-04-01 13:19:59

回答

1

我認爲get_first_word錯過了一個參數:它應該'返回'這個單詞和其他部分,說明Pivot沒有出現在輸入中的可能性。

我也移動了參數,遵循傳統的'輸入開始,輸出結束'。

get_first_word(Input, Pivot, Word, Rest):- 
    append(Word, [Pivot|Rest], Input), !. 
get_first_word(Input, _Pivot, Input, []). 

split_at([], _). 
split_at(Input, Pivot):- 
    get_first_word(Input, Pivot, W, Rest), 
    writef(W),nl, 
    split_at(Rest, Pivot). 

測試:

?- split_at("highs and lows", 0'). 
highs 
and 
lows 
true . 
+0

它完美地工作。謝謝您的幫助! – UrhoKarila

1

如果使用SWI-Prolog的,它是值得使用原子來表示句子,字,詞的部分等考慮。正如你所看到here,你的問題變得(如果你的句子是原子):

?- atomic_list_concat(Ws, ' ', 'highs and lows'). 
Ws = [highs, and, lows]. 

有進一步的有用的謂詞,例如atom_concat/3(我們可以說它是append/3的原子),或sub_atom/5它可以是有多種用途。作爲一個附註,SWI-Prolog對原子長度沒有人爲限制,實際上建議使用原子而不是字符串或字符代碼列表。

1

當描述列表(在這種情況下:字符代碼列表,這是你的字符串)時,也總是考慮使用DCG。例如:

string_pivot_tokens(Cs, P, Ts) :- phrase(tokens(Cs, P, []), Ts). 

tokens([], _, Ts)  --> token(Ts). 
tokens([C|Cs], P, Ts) --> 
     ( { C == P } -> token(Ts), tokens(Cs, P, []) 
     ; tokens(Cs, P, [C|Ts]) 
     ). 

token([])  --> []. 
token([T|Ts]) --> { reverse([T|Ts], Token) }, [Token]. 

例子:

?- string_pivot_tokens("highs and lows", 0' , Ts), maplist(atom_codes, As, Ts). 
Ts = [[104, 105, 103, 104, 115], [97, 110, 100], [108, 111, 119, 115]], 
As = [highs, and, lows] ; 
false. 
相關問題