我是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。
如何让它发挥作用?
答案 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).