【问题标题】:Comparing the contents of two lists in prolog比较prolog中两个列表的内容
【发布时间】:2012-01-22 08:55:44
【问题描述】:

我有一些家庭作业,但我被困在某一点上。我得到了一些类似的事实:

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 的下一个字母。下次回溯运行时,它将使用单词的开头,而我想使用列表中的第二个字母。关于如何解决这个问题的任何想法?

对于任何语法错误,我深表歉意,感谢您的帮助。

【问题讨论】:

    标签: list prolog compare letters


    【解决方案1】:

    为了移动到 fact 一词中的下一个字母,您需要将 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% 的匹配字母。

    【讨论】:

    • 非常感谢,我根本没想到。至于你提到的重要案例,我的大部分任务是制作一种字典来纠正有任何错误的给定句子,但每个单词只有一个字母错误,所以我不相信我将不得不计算匹配或错误,因为它们始终是最大 1。无论如何,感谢您的回答。
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多