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

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

它只是返回假。

如何使它工作?

4

2 回答 2

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,否则就按原样返回单词。

于 2013-01-31T14:47:07.540 回答
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).
于 2013-01-31T17:39:27.343 回答