2013-01-31 119 views
0

我是Prolog的新手,我對理解它的一些問題有很大的困惑。例如,我有這樣的「功能」:使用函數的返回

smstofre([], []). 
smstofre([T|R], [X|Y] :- frword(T,X), smstofre(R,Y). 

與以下「數據庫」:

frword(bjr,bonjour). 

這是利用一個寫得不好的法文句子翻譯成正確的。 我用它這樣的:

?- smstofre([bjr],E). 
E = [bonjour]. 

這是很酷,但我想創建一個「功能」,將採取一個簡單的字符串,分裂他的字和發回同樣的結果有以前的「功能」。 因此,例如:

?- translate('bjr cb ?', E). 

應該返回:

E = [bonjour,combien,?]. 

我試圖使用SWI-序言的功能atomic_list_concat分割字符串,並創建一個能夠做的一切功能,所以我這樣做:

reduireFosse(E, F) :- atomic_list_concat(F,' ', E), smstofre(F, E). 

它只是返回false。

如何使它工作?

回答

1

我猜你reduireFosse/2程序應爲:

reduireFosse(E, G) :- atomic_list_concat(F,' ', E), smstofre(F, G). 

注reduireFosse的頭部的第二個參數採用了全新的新鮮可變G這是在smstofre的第二個參數使用。

smstofre/2的第二句話應改爲:

smstofre([T|R], [X|Y]) :- 
    (frword(T,W) -> X = W ; X = T), smstofre(R,Y). 

這裏我們使用->,以免留下一個選擇點時調用frword/2成功,否則僅返回單詞保持原樣。

+0

謝謝!您的reduireFosse版本效果很好,但由於某種原因,您的smstofre版本返回false。所以我保持我的,它的工作很好。 – Maeln

1

您可以使用functionnal設計MAPLIST:

frword(bjr, bonjour) :- !. 
frword(cb, combien) :- !. 
% for words not found, avoid if then else 
frword(X, X). 

smstofre(SMS, FRE) :- 
    maplist(frword, SMS, FRE). 

translate(SMS, FRE) :- 
    atomic_list_concat(Tmp_In, ' ', SMS), 
    smstofre(Tmp_In, Tmp_Out), 
    % build a "french" sentence 
    atomic_list_concat(Tmp_Out, ' ', FRE). 
+0

謝謝,我不知道該怎麼做,這感覺更像我用的東西。 – Maeln