Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
ЛАБОРАТОРНАЯ РАБОТА № 7
ИДЕНТИФИКАЦИЯ СЛОВ, НАПИСАННЫХ С ОШИБКАМИ
ЦЕЛЬ. Целью лабораторной работы является расмотрение способа реализации распознавания ошибочных слов в языке ПРОЛОГ.
КРАТКОЕ ТЕОРЕТИЧЕСКОЕ ВВЕДЕНИЕ.
Важной задачей является распознавание ошибочно записанных слов. Такая задача возникает, например, при работе с семантическим вопросником, когда пользователь должен вводить вопросы на естественном языке, а система должна находить ответы на вопросы из текстовой базы знаний.
Упростим задачу: будем считать, что имеют место следующие ошибочные ситуации.
Напишем программу, которая эти ситуации выявляет. У нас должны быть образцы слов, например,
word("moloko").
word("kefir").
word("tvorog").
Пользователь должен вводить свое слово, например,
Goal
raspoz("molko",X),
write(X),
readchar(_).
Если система распознает слово (пропущена буква), то она выведет правильное слово на экран.
Для идентификации слов, написанных с ошибками, можно рассмотреть следующий код.
predicates
nondeterm check(string,string)
nondeterm raspoz(string,string)
nondeterm word(string)
Сlauses
raspoz(Y,X):-
word(Z),
check(Y,Z),
X=Z.
word("moloko").
word("kefir").
word("tvorog").
check("",Z):-
str_len(Z,Z1),
Z1<=2.
check(Y,""):-
str_len(Y,Y1),
Y1<=2.
check(Y,Z):-
frontchar(Y,CY,YR),
frontchar(Z,CZ,ZR),
CY=CZ,
check(YR,ZR).
check(Y,Z):-
frontchar(Y,CY,YR),
frontchar(Z,CZ,ZR),
not(CY=CZ),
frontchar(YR,C2,YR2),
frontchar(ZR,Z2,ZR2),
C2=Z2,
check(YR2,ZR2).
check(Y,Z):-
frontchar(Y,CY,YR),
frontchar(Z,CZ,ZR),
not(CY=CZ),
frontchar(ZR,CZ2,ZR2),
CY=CZ2,
check(YR,ZR2).
check(Y,Z):-
frontchar(Y,CY,YR),
frontchar(Z,CZ,ZR),
not(CY=CZ),
frontchar(YR,CY2,YR2),
CY2=CZ,
check(YR2,ZR).
Goal
raspoz("molko",X),
write(X),
readchar(_).
В этой программе у нас есть три эталонных слова:
word("moloko").
word("kefir").
word("tvorog").
Вызов для разбора слова реализуется командами
raspoz("molko",X),
write(X),
readchar(_).
Правила
check("",Z):-
str_len(Z,Z1),
Z1<=2.
check(Y,""):-
str_len(Y,Y1),
Y1<=2.
допускают совпадение слов при условии, что их длины хоть и разные, но не более чем на два символа.
Правило
check(Y,Z):-
frontchar(Y,CY,YR),
frontchar(Z,CZ,ZR),
CY=CZ,
check(YR,ZR).
фиксирует действия, выполняемые при совпадении очередных букв в словах.
Правило
check(Y,Z):-
frontchar(Y,CY,YR),
frontchar(Z,CZ,ZR),
not(CY=CZ),
frontchar(YR,C2,YR2),
frontchar(ZR,Z2,ZR2),
C2=Z2,
check(YR2,ZR2).
распознает ситуацию, когда очередные буквы не совпадают, но совпадают следующие, т.е. делается предположение об однократной ошибке.
Наконец, два последних правила для check(Y,Z) относятся к ситуациям, когда пропущена одна буква во входном слове (тогда сравнивается следующая буква в образце с текущей букве во входном слове), либо вставлена лишняя буква.
ЗАДАНИЕ
1. Допишите правило (-ла) для случая, когда пользователь переставил буквы местами, например, в слове molook (=moloko).
2. Допишите правила, которые допускают только такие несоответствия между буквами, которые созвучны, например,
malako= moloko
tvorog= tvorok=tvorox
Но слова muloko не отождествляется со словом moloko. Т.е. следует задать похожие по звучанию сочетания пар букв.
3. Допишите правила, которые игнорируют в словах спец. символы, например, пробелы или запятые. Так, слово
mo lo?ko есть moloko.