假设我有这些规则:
rule([a,t,e],[8]).
rule([f,o,r],[4]).
我必须检查一个单词(例如[f,o,r,t,r,e,s,s]
)是否有一个单词在规则列表中,如果要删除该单词并将其替换为它所代表的数字。(所以它变成[4,t,r,e,s,s]
)。
有什么想法吗?
答案 0 :(得分:2)
假设您想要一次替换:
text_l33t(W, L33t) :-
rule(A, B),
phrase( ( seq(Pre), seq(A), seq(Post) ), W),
phrase( ( seq(Pre), seq(B), seq(Post) ), L33t).
seq([]) -->
[].
seq([E|Es]) -->
[E],
seq(Es).
或者,您可以表达与append/3
的关系,但即使是最简单的更复杂的示例,append/3
也会使事情变得更难处理。
考虑使用this answer中描述的Prolog标志double_quotes
,因为它允许您使用双引号。然后,您可以编写rule("to","2"). rule("ight","ite").
并获得良好的答案替换,如下所示:
?- text_l33t("right", L).
L = "rite".
如果您希望选择多个替换,则指定的内容会变得复杂一些。重叠不同的重写怎么样?那些更长更长的重写怎么样?以下定义包含所有可能的重写:
text_xl33t(W, W).
text_xl33t(W, L33t) :-
text_l33t(W, L0),
text_xl33t(L0, L33t).
你可能想要的是最大重写。虽然你可以在Prolog中写下来,但我不会这样做作为初学者:你将离开Prolog的纯粹单调部分。
编辑:看来你对我所描述的内容仍然不满意。所以这是text_maxl33t/2
:
text_maxl33t(W, L33t) :-
text_xl33t(W, L33t),
\+ text_l33t(L33t, _).
请注意,此谓词仍然是一种关系。也就是说,对于单个单词,您可能有几个独立的maxl33ts,因为重写不一定是汇合的。