2011-12-16 60 views
3

我正在做某種功課,而且我堅持一點。我給出的一些事實像:比較序言中兩個列表的內容

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). 

問題是我不知道如何移動到這個詞其實下一個字母。下一次回溯將運行它將使用單詞的頭部,而我想使用列表中的第二個字母。有關如何解決這個問題的任何想法?

對於任何語法錯誤,我很抱歉,我很感謝您的幫助。

回答

1

爲了將轉移到事實這個詞的下一個字母,您需要從第三個參數中提取這個詞,然後把它帶上。在你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%的匹配字母。

+0

非常感謝你,我根本沒有想到這一點。至於你提到的重要情況,你提到我的任務的大部分是製作一種字典來糾正給定的句子與任何一種錯誤,但只有1個字母每個單詞錯誤,所以我不相信我將不得不計算匹配或錯誤,因爲它們總是最大1.無論如何感謝你的答案。 – 2011-12-17 11:29:03