Переводчик на Prolog (база данных)

      Комментарии к записи Переводчик на Prolog (база данных) отключены

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 год, 4 мес. назад.

  • Автор
    Сообщения
  • #2599

    questioner
    Участник

    Нужно написать на Prolog программу-переводчик (англо-русский и русско-английский). Программа должна содержать базу данных слов (словарь) и получить перевод любого слова базы. Реализация нужна на Visual Prolog 5.2 или Turbo Prolog.
    Примеры по прологе с БД на Prolog я смотрел, но не понял как применить это для моей задачи.

  • #2600

    Реализации на Turbo Prolog и SWI Prolog будут отличаться лишь объявлением базы данных и объявлением предикатов. В SWI/GNU Prolog для описания предикатов, которые можно обрабатывать с помощью assert и retract используется ключевое слово dynamic, а в Turbo/Visual Prolog — секция databases:

    database dictionary
    	word(string, string)

    В SWI Prolog предикаты объявлять не требуется, но в Turbo Prolog для этого используется секция predicates:

    predicates
    	menu(integer)
    	ru_en(string)
    	en_ru(string)

    Видно, что в нашей программе будет 3 функции: menu позволяет пользователю выбрать нужный пункт (добавление/удаление слова из словаря, перевод), функции ru_en и en_ru позволяют получить на экране все варианты перевода заданного слова.

    Реализация функций в Visual Prolog размещается в разделе clauses:

       	menu(0):-
       		write("enter:"), nl,
       		write("\t0 - exit"), nl,
       		write("\t1 - add word"), nl,
       		write("\t2 - remove word"), nl,
       		write("\t3 - translate ru-en"), nl,
       		write("\t4 - translate en-ru"), nl,
       		write(": "), readint(MenuItem), 
       		MenuItem <> 0, !, menu(MenuItem); !.
       	menu(1):-
       		write("enter russian word: "),
       		readln(Russian),
       		write("enter english word: "),
       		readln(English),
       		assert(word(Russian, English)), !,
       		menu(0).
       	menu(2):-
       		write("enter russian word: "),
       		readln(Russian),
       		write("enter english word: "),
       		readln(English),
       		retract(word(Russian, English)), !,
       		menu(0); menu(0), !.
       	menu(3):-
       		write("enter russian word: "),
       		readln(Russian),
       		word(Russian, _English),
       		ru_en(Russian), !, menu(0);
       		write("no such word in the base\n"), nl, !, 
       		menu(0).
       	menu(4):-
       		write("enter english word: "),
       		readln(English),
       		word(_Russian, English),
       		en_ru(English), !, menu(0);
       		write("no such word in the base\n"), nl, !, 
       		menu(0).
       	menu(_MenuItem):-
       		write("bad menu item"), nl, !,
       		menu(0).

    Предикат menu принимает номер пункта меню, который требуется выполнить, но нулевой пункт выводит на экран все пункты и запрашивает действие, которое требуется выполнить. Последний предикат принимает анонимную переменную и срабатывает в случае, если пользователь ввел некорректный пункт меню. Подробное описание реализации меню на Prolog.
    Третий и четвертый пункты выполняют вызов предикатов для вывода вариантов перевода на экран в случае, если в базе есть искомое слово или сообщение об отсутствии перевода — для реализации такого поведения используется оператор точка с запятой.
    Предикаты, выполняющие перевод используют поиск с возвратами для вывода всех вариантов перевода:

    	ru_en(Russian):-
    		word(Russian, English),
    		write(Russian), write(" -> "), write(English), nl, fail; !.
    		
    	en_ru(English):-
    		word(Russian, English),
    		write(English), write(" -> "), write(Russian), nl, fail; !.

    Для запуска программы нужно вызвать предикат menu(0) — в Visual Prolog это делается в секции goal, являющейся точкой входа:

     goal
     	menu(0).

Для ответа в этой теме необходимо авторизоваться.