比较prolog中两个列表的内容

时间:2011-12-16 22:20:28

标签: list prolog compare letters

我正在做一些功课,我坚持一点。我得到了一些类似的事实:

word([h,e,l,lo]).
word([m,a,n]).
word([w,o,m,a,n]). etc

我必须制定一条规则,以便用户输入一个字母列表,我应该将列表与我所拥有的字词进行比较,并纠正任何可能的错误。如果第一个字母位于正确的位置,这是我正在使用的代码:

mistake_letter([],[]).
mistake_letter([X|L1],[X|L2]):-
             word([X|_]),
             mistake_letter(L1,L2).

问题是我不知道如何移动到单词fact中的下一个字母。下次回溯运行时,它将使用单词的头部,而我想使用列表中的第二个字母。关于如何解决这个问题的任何想法?

我对任何语法错误感到抱歉,感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

为了移动到单词fact 中的下一个字母,你需要将这个单词从事实中作为第三个参数,然后将它带到骑行中。在mistake_letter/2中,您将逐个选择单词,然后拨打mistake_letter/3,传递您选择的单词,如下所示:

mistake_letter(L1,L2):-
    word(W),
    mistake_letter(L1,L2,W).

如果被修正的单词中的字母在您选择的单词的字母之前用完,则需要更改基本情况以执行某些操作。你做什么取决于你的任务:你可以回溯mistake_letter([],[],[]).,声明一个匹配mistake_letter([],[],_).,将单词的尾部附加到更正mistake_letter([],W,W).或做其他事情。

如果要更正的单词的第一个字母与您选择的单词的第一个字母相匹配,您还需要一个简单的案例来涵盖这种情况:

mistake_letter([X|L1],[X|L2],[X|WT]):-
    mistake_letter(L1, L2, WT).

最后,您需要最重要的案例:当首字母不匹配时该怎么办。这可能是你的大部分工作:其余的只是样板递归。为了使其正确,您可能需要将mistake_letter/3更改为mistake_letter/4以便能够计算匹配数,然后将其与原始单词中的字母数进行比较。这样可以让您删除“{更正”,例如[w,o,r,l,d] - > [h,e,l,l,o]只有20%的匹配字母。