Программирование в Логике. Чанышев О.Г. - 19 стр.

UptoLike

Составители: 

37
fronttoken("22all kids do fine",TOK2,REST2),
write("TOK = ",TOK2," REST = ",REST2),nl,
fronttoken("22.66all kids do fine",TOK3,REST3),
write("TOK = ",TOK3," REST = ",REST3),nl,
fronttoken("-22.66all kids do fine",TOK4,REST4),
write("TOK = ",TOK4," REST = ",REST4),nl,
fronttoken(".66all kids do fine",TOK5,REST5),
write("TOK = ",TOK5," REST = ",REST5),nl,
fronttoken("Иди ко мне!",TOK7,REST7),
write("Исходная строка >>> ","Иди ко мне!"),nl,
write("TOK = ",TOK7," REST = ",REST7).
goal
token().
% Выход:
TOK = all REST = kids do fine
TOK = all REST = +kids do fine
TOK = 22 REST = all kids do fine
TOK = 22.66 REST = all kids do fine
TOK = – REST = 22.66all kids do fine
TOK = . REST = 66all kids do fine
Исходная строка >>> Иди ко мне!
TOK = Иди REST = ко мне!
Последнее использование fronttoken демонстрирует, что вы
можете использовать этот предикат для парсирования текстов на
русском языке, что не позволял TurboProlog v.2.0. Давайте, мы это
и сделаем.
domains
слово=symbol
часть_речи=symbol
facts -f1
лексема(слово,часть_речи)
знак(symbol,symbol)
predicates
парсировать_предложение(symbol)
38
определить_нечто(symbol)
goal
assert(лексема("я","местоимение")),
assert(лексема("бы","частица")),
assert(лексема("на","предлог")),
assert(лексема("но","союз")),
assert(лексема("выходить","глагол")),
assert(лексема("вышел","глагол")),
assert(лексема("идет","глагол")),
assert(лексема("улица","существительное")),
assert(лексема("улицу","существительное")),
assert(лексема("дождь","существительное")),
assert(знак(",","запятая")),
assert(знак(".","точка")),
Предл="Я бы вышел на улицу, но идет
сильный дождь.",
парсировать_предложение(Предл).
clauses
парсировать_предложение(Предл):-
fronttoken(Предл,Нечто,Остаток),!,
upper_lower(Нечто,Нечто1), % преобразование регистра
определить_нечто(Нечто1),
парсировать_предложение(Остаток);!.
определить_нечто(X):-
лексема(X,Часть_речи),!,
write("Слово = ",X," Часть_речи = ",Часть_речи),nl;
знак(X,Наименование),!,
write("Знак препинания = ",X," Наименование =
",Наименование),nl;
write("Элемент ",X," не определен"),nl.
Выход:
Слово = я Часть_речи = местоимение
Слово = бы
Часть_речи = частица
Слово = вышел Часть_речи = глагол
Слово = на Часть_речи = предлог
Слово = улицу Часть_речи = существительное
Знак препинания = , Наименование = запятая
Слово = но Часть_речи = союз
     fronttoken("22all kids do fine",TOK2,REST2),                        определить_нечто(symbol)
     write("TOK = ",TOK2," REST = ",REST2),nl,                           goal
     fronttoken("22.66all kids do fine",TOK3,REST3),                     assert(лексема("я","местоимение")),
     write("TOK = ",TOK3," REST = ",REST3),nl,                           assert(лексема("бы","частица")),
     fronttoken("-22.66all kids do fine",TOK4,REST4),                    assert(лексема("на","предлог")),
     write("TOK = ",TOK4," REST = ",REST4),nl,                           assert(лексема("но","союз")),
     fronttoken(".66all kids do fine",TOK5,REST5),                       assert(лексема("выходить","глагол")),
     write("TOK = ",TOK5," REST = ",REST5),nl,                           assert(лексема("вышел","глагол")),
     fronttoken("Иди ко мне!",TOK7,REST7),                               assert(лексема("идет","глагол")),
     write("Исходная строка >>> ","Иди ко мне!"),nl,                     assert(лексема("улица","существительное")),
     write("TOK = ",TOK7," REST = ",REST7).                              assert(лексема("улицу","существительное")),
     goal                                                                assert(лексема("дождь","существительное")),
                                                                         assert(знак(",","запятая")),
     token().                                                            assert(знак(".","точка")),
     % Выход:                                                            Предл="Я бы вышел на улицу, но идет сильный дождь.",
                                                                         парсировать_предложение(Предл).
     TOK = all REST = kids do fine                                       clauses
     TOK = all REST = +kids do fine                                      парсировать_предложение(Предл):-
     TOK = 22 REST = all kids do fine                                    fronttoken(Предл,Нечто,Остаток),!,
     TOK = 22.66 REST = all kids do fine                                 upper_lower(Нечто,Нечто1), % преобразование регистра
     TOK = – REST = 22.66all kids do fine                                определить_нечто(Нечто1),
     TOK = . REST = 66all kids do fine                                   парсировать_предложение(Остаток);!.
     Исходная строка >>> Иди ко мне!                                     определить_нечто(X):-
     TOK = Иди REST = ко мне!                                            лексема(X,Часть_речи),!,
                                                                         write("Слово = ",X," Часть_речи = ",Часть_речи),nl;
      Последнее использование fronttoken демонстрирует, что вы           знак(X,Наименование),!,
можете использовать этот предикат для парсирования текстов на            write("Знак препинания = ",X," Наименование            =
русском языке, что не позволял TurboProlog v.2.0. Давайте, мы это   ",Наименование),nl;
и сделаем.                                                               write("Элемент ",X," не определен"),nl.
      domains                                                            Выход:
      слово=symbol                                                       Слово = я Часть_речи = местоимение
      часть_речи=symbol                                                  Слово = бы Часть_речи = частица
      facts -f1                                                          Слово = вышел Часть_речи = глагол
      лексема(слово,часть_речи)                                          Слово = на Часть_речи = предлог
      знак(symbol,symbol)                                                Слово = улицу Часть_речи = существительное
      predicates                                                         Знак препинания = , Наименование = запятая
      парсировать_предложение(symbol)                                    Слово = но Часть_речи = союз

                               37                                                                38