Ответ в теме: Переводчик на 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).