Получение нескольких ответов Visual Prolog
Формулировка задачи:
Добрый день! Нужно реализовать программу "Англо-русский словарь". Возникла такая проблема: база хранится в отдельном файле, при работе программа выводит не все возможные переводы слова, а только первый. Пожалуйста, помогите разобраться, в чем дело
Код:
Файл с базой (пока пробный, поэтому маленький):
Заранее благодарю всех, кто отзовется
Листинг программы
- DOMAINS
- rus, eng = string
- file = f
- Fact=word(rus, eng)
- Facti=Fact*
- DATABASE
- word(rus, eng)
- PREDICATES
- nondeterm fact(Fact)
- nondeterm rus2eng(rus, eng)
- nondeterm eng2rus(rus, eng)
- nondeterm punkt(char)
- nondeterm menu
- nondeterm result
- nondeterm poelem(Facti)
- CLAUSES
- rus2eng(Russian,Word):- word(Russian,Word),!.
- rus2eng(_,"Перевод слова не найден ").
- eng2rus(Russian,Word):- word(Russian,Word).
- eng2rus("Перевод слова не найден ",_).
- fact(word(Russian,English)):-word(Russian, English).
- result:-
- existfile("D:\words.txt"),!, /* тест на наличие файла с данным именем */
- consult("D:\words.txt"),menu. /* Произвольный текстовый файл, содержащий факты,
- совпадающие по синтаксису с предикатами описанной в программе БД,
- считывается в память (загружается) при помощи встроенного предиката consult */
- result:-
- openwrite(f,"D:\words.txt"), /* если файла с базой не существует, создаем его */
- closefile(f),menu.
- poelem([]):- nl.
- poelem([H|T]):- write(H,"\n"),poelem(T).
- menu:-
- write("1 - Перевод с русского языка на английский"),nl,
- write("2 - Перевод с английского языка на русский"),nl,
- write("3 - Добавить новую запись"),nl,
- write("4 - Изменение перевода русского слова"),nl,
- write("5 - Изменение перевода английского слова"),nl,
- write("6 - Удаление записи из словаря"),nl,
- write("7 - Вывод всех записей"),nl,
- write("0 - Выход"),nl,
- readchar(C), punkt(C).
- punkt('1'):-nl,
- write("Введите русское слово: "),readln(Rus),
- rus2eng(Rus, Eng),
- write("Перевод: ",Eng),nl,nl,
- readchar(_),menu.
- punkt('2'):-nl,
- write("Введите английское слово: "),readln(Eng),
- eng2rus(Rus, Eng),
- write("Перевод: ",Rus),nl,nl,
- readchar(_),menu.
- punkt('3'):-nl,
- write("Введите русское слово: "),readln(Rus),
- write("Введите перевод: "),readln(Eng),
- assert(word(Rus,Eng)),nl,menu.
- punkt('4'):-nl,
- write("Введите русское слово: "),readln(Rus),
- write("Введите перевод: "),readln(Eng),
- retract(word(Rus,_)),
- assert(word(Rus,Eng)),nl,
- menu.
- punkt('5'):-nl,
- write("Введите английское слово: "),readln(Eng),
- write("Введите перевод: "),readln(Rus),
- retract(word(_,Eng)),
- assert(word(Rus,Eng)),nl,
- menu.
- punkt('6'):-nl,write("Введите английское слово, запись о котором нужно удалить: "),
- readln(Eng),retract(word(_,Eng)),nl,menu.
- punkt('7'):-findall(Fact,fact(Fact),Facti),nl,poelem(Facti),menu.
- punkt('0'):-save("D:\words.txt"),retractall(_).
- punkt(_):- menu.
- GOAL
- result.
Листинг программы
- word("дерево","tree")
- word("облако","cloud")
- word("машина","car")
- word("лицо","face")
- word("лицо","person")
Я подумала, что для вывода всех возможных переводов нужно использовать предикат findall. Только я никак не могу понять, как записать его аргументы (для перевода русских слов строчки 50-54). В конце программы (84 строчка) findall собирает целые факты, проблем с пониманием этого нет. А тут нужно ведь выбрать только перевод слова...
Решение задачи: «Получение нескольких ответов Visual Prolog»
textual
Листинг программы
- punkt('1'):-nl,
- write("Введите русское слово: "),readln(Rus),
- not( rus2eng(Rus, Eng), not( write("Перевод: ",Eng),nl,nl ) ),
- readchar(_),menu.
Объяснение кода листинга программы
- Вывод сообщения
Введите русское слово:
и чтение русского слова из стандартного ввода (Rus). - Преобразование русского слова в английский (rus2eng(Rus, Eng)).
- Если перевод не удался, то выводится сообщение
Ошибка перевода
и процесс повторяется. - Если перевод удался, то выводится сообщение
Перевод:
и перевод (Eng) выводится на экран. - Чтение символа из стандартного ввода (readchar(_)).
- Переход в главное меню (menu).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д