Сравнение содержимого двух списков в прологе - PullRequest
3 голосов
/ 17 декабря 2011

У меня какая-то домашняя работа, и я застрял в одной точке. Мне даны некоторые факты, подобные этим:

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 Ответ

1 голос
/ 17 декабря 2011

Чтобы перейти к следующей букве в слове факт , вам нужно сделать слово из факта третьим аргументом и взять его с собой для поездки.В вашем 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% совпадающих букв.

...