Получение нескольких ответов Visual Prolog

Узнай цену своей работы

Формулировка задачи:

Добрый день! Нужно реализовать программу "Англо-русский словарь". Возникла такая проблема: база хранится в отдельном файле, при работе программа выводит не все возможные переводы слова, а только первый. Пожалуйста, помогите разобраться, в чем дело Код:
Листинг программы
  1. DOMAINS
  2. rus, eng = string
  3. file = f
  4. Fact=word(rus, eng)
  5. Facti=Fact*
  6. DATABASE
  7. word(rus, eng)
  8. PREDICATES
  9. nondeterm fact(Fact)
  10. nondeterm rus2eng(rus, eng)
  11. nondeterm eng2rus(rus, eng)
  12. nondeterm punkt(char)
  13. nondeterm menu
  14. nondeterm result
  15. nondeterm poelem(Facti)
  16. CLAUSES
  17. rus2eng(Russian,Word):- word(Russian,Word),!.
  18. rus2eng(_,"Перевод слова не найден ").
  19. eng2rus(Russian,Word):- word(Russian,Word).
  20. eng2rus("Перевод слова не найден ",_).
  21. fact(word(Russian,English)):-word(Russian, English).
  22. result:-
  23. existfile("D:\words.txt"),!, /* тест на наличие файла с данным именем */
  24. consult("D:\words.txt"),menu. /* Произвольный текстовый файл, содержащий факты,
  25. совпадающие по синтаксису с предикатами описанной в программе БД,
  26. считывается в память (загружается) при помощи встроенного предиката consult */
  27. result:-
  28. openwrite(f,"D:\words.txt"), /* если файла с базой не существует, создаем его */
  29. closefile(f),menu.
  30. poelem([]):- nl.
  31. poelem([H|T]):- write(H,"\n"),poelem(T).
  32. menu:-
  33. write("1 - Перевод с русского языка на английский"),nl,
  34. write("2 - Перевод с английского языка на русский"),nl,
  35. write("3 - Добавить новую запись"),nl,
  36. write("4 - Изменение перевода русского слова"),nl,
  37. write("5 - Изменение перевода английского слова"),nl,
  38. write("6 - Удаление записи из словаря"),nl,
  39. write("7 - Вывод всех записей"),nl,
  40. write("0 - Выход"),nl,
  41. readchar(C), punkt(C).
  42. punkt('1'):-nl,
  43. write("Введите русское слово: "),readln(Rus),
  44. rus2eng(Rus, Eng),
  45. write("Перевод: ",Eng),nl,nl,
  46. readchar(_),menu.
  47. punkt('2'):-nl,
  48. write("Введите английское слово: "),readln(Eng),
  49. eng2rus(Rus, Eng),
  50. write("Перевод: ",Rus),nl,nl,
  51. readchar(_),menu.
  52. punkt('3'):-nl,
  53. write("Введите русское слово: "),readln(Rus),
  54. write("Введите перевод: "),readln(Eng),
  55. assert(word(Rus,Eng)),nl,menu.
  56. punkt('4'):-nl,
  57. write("Введите русское слово: "),readln(Rus),
  58. write("Введите перевод: "),readln(Eng),
  59. retract(word(Rus,_)),
  60. assert(word(Rus,Eng)),nl,
  61. menu.
  62. punkt('5'):-nl,
  63. write("Введите английское слово: "),readln(Eng),
  64. write("Введите перевод: "),readln(Rus),
  65. retract(word(_,Eng)),
  66. assert(word(Rus,Eng)),nl,
  67. menu.
  68. punkt('6'):-nl,write("Введите английское слово, запись о котором нужно удалить: "),
  69. readln(Eng),retract(word(_,Eng)),nl,menu.
  70. punkt('7'):-findall(Fact,fact(Fact),Facti),nl,poelem(Facti),menu.
  71. punkt('0'):-save("D:\words.txt"),retractall(_).
  72. punkt(_):- menu.
  73. GOAL
  74. result.
Файл с базой (пока пробный, поэтому маленький):
Листинг программы
  1. word("дерево","tree")
  2. word("облако","cloud")
  3. word("машина","car")
  4. word("лицо","face")
  5. word("лицо","person")
Заранее благодарю всех, кто отзовется
Я подумала, что для вывода всех возможных переводов нужно использовать предикат findall. Только я никак не могу понять, как записать его аргументы (для перевода русских слов строчки 50-54). В конце программы (84 строчка) findall собирает целые факты, проблем с пониманием этого нет. А тут нужно ведь выбрать только перевод слова...

Решение задачи: «Получение нескольких ответов Visual Prolog»

textual
Листинг программы
  1. punkt('1'):-nl,
  2. write("Введите русское слово: "),readln(Rus),
  3. not( rus2eng(Rus, Eng), not( write("Перевод: ",Eng),nl,nl ) ),
  4. readchar(_),menu.

Объяснение кода листинга программы

  1. Вывод сообщения Введите русское слово: и чтение русского слова из стандартного ввода (Rus).
  2. Преобразование русского слова в английский (rus2eng(Rus, Eng)).
  3. Если перевод не удался, то выводится сообщение Ошибка перевода и процесс повторяется.
  4. Если перевод удался, то выводится сообщение Перевод: и перевод (Eng) выводится на экран.
  5. Чтение символа из стандартного ввода (readchar(_)).
  6. Переход в главное меню (menu).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут