2011-12-16 4 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. В любом случае спасибо за ответ. –

Смежные вопросы