2013-01-31 85 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