使用函数的返回

时间:2013-01-31 14:12:36

标签: prolog

我是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-prolog的函数atomic_list_concat来分割字符串并创建一个可以执行其他操作的函数,所以我这样做了:

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

它只是返回false。

如何让它发挥作用?

2 个答案:

答案 0 :(得分: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的调用成功时留下选择点,否则只返回该字。

答案 1 :(得分:1)

您可以使用带有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).