Prolog:如何检查列表中是否包含单词

时间:2014-11-03 00:37:06

标签: list prolog

假设我有这些规则:

rule([a,t,e],[8]).
rule([f,o,r],[4]).

我必须检查一个单词(例如[f,o,r,t,r,e,s,s])是否有一个单词在规则列表中,如果要删除该单词并将其替换为它所代表的数字。(所以它变成[4,t,r,e,s,s])。

有什么想法吗?

1 个答案:

答案 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,因为重写不一定是汇合的。