Создать БД, предикаты в которой имеют ряд атомов - Prolog

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

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

Необходимо создать бд предикаты в которой имеют ряд атомов - список рабочих, имя, год рождения, образование, отдел, специальность, стаж. Список предикатов(бд) находится во внешнем файле. /***** перенести назад в вопрос ****/ Пишем следующее
Листинг программы
  1. :- dynamic worker/6.
  2. % определение шестиарного предиката может изменяться в процессе выполнения (assert и retract)
  3. :- multifile worker/6. % указанный предикат может быть определен более чем в одином файле
  4. %worker(name, date of birth, education, department, specialty, experience)
  5. worker(mihailov, 1965, hight, technology, mechanic, 30).
  6. worker(petrov, 1972, hight, managment, economic, 27).
  7. worker(ann, 1988, hight, bookkeeping, economic, 5).
Далее нужно создать возможности: - считывание динамических данных из файла, - сохранение динамической базы данных в файл, - просмотр базы данных, - пополнение динамической базы данных, - удаление заданной записи из базы данных, - выборка некоторых записей по заданному условию. Я составил меню через которое можно выполнять некоторые действия (дописываем):
Листинг программы
  1. readchar(Ch):-get_char(Ch),get_char(_).
  2. menuitem('0'):-writeln('--- end---').
  3. menuitem('1'):-writeln('--- add ---'),
  4. write('enter name:'),read(Nm),
  5. assert(worker(Nm,---,---,---,---,---)).
  6. menuitem('2'):-writeln('--- delete ---'),
  7. write('enter name:'),read(Nm),
  8. % retract( Term ) - удаляет первый факт из базы данных, который соответствует заданному факту Term.
  9. retract(worker(Nm,_,_,_,_,_)).
  10. % consult - добавление некоторого факта через консоль или из файла к уже имеющемуся списку фактов в бд
  11. menuitem('3'):-consult('base.pl'). % подключает файл base.pl - ? (вопрос)
  12. % listing(Name) - распечатка содержащихся в программе предикатов с именем Name.
  13. menuitem('4'):-listing(worker),write('press return'),get_char(_).
  14. menuitem('5'):-writeln('--- save ---'),
  15. % tell(X) - открывает файл X, если он еще не открыт, и определяет, что текущим выходным потоком данных,
  16. % в который производится запись, является указанный файл
  17. tell('base.pl'),listing(worker),told.
  18. % told - Этот предикат закрывает текущий выходной поток данных (файл) и записывает маркер конца файла в соответствующий файл.
  19. Текущим выходным потоком данных становится дисплей терминала ( user ).
  20. menuitem('6'):-writeln('--- search'),
  21. write('enter name:'),read(Num),
  22. worker(Nm,Num,_,_,_,_), writeln(Nm),fail;true.
  23. menuitem('7'):-retractall(worker(_,_,_,_,_,_)),writeln('--- cleared').
  24. menu:- repeat, nl,
  25. writeln('1-add'),
  26. writeln('2-delete'),
  27. writeln('3-load'),
  28. writeln('4-output'),
  29. writeln('5-save'),
  30. writeln('6-search'),
  31. writeln('7-clear'),
  32. writeln('0-exit'),
  33. write('->'),readchar(Num), menuitem(Num),Num='0'.
  34. %внутренняя цель
  35. :-menu.
В итоге получаем:
Листинг программы
  1. worker(mihailov, 1965, hight, technology, mechanic, 30).
  2. worker(petrov, 1972, hight, managment, economic, 27).
  3. worker(ann, 1988, hight, bookkeeping, economic, 5).
  4. readchar(Ch):-get_char(Ch),get_char(_).
  5. menuitem('0'):-writeln('--- end---').
  6. menuitem('1'):-writeln('--- add ---'),
  7. write('enter name:'),read(Nm),
  8. assert(worker(Nm,---,---,---,---,---)).
  9. menuitem('2'):-writeln('--- delete ---'),
  10. write('enter name:'),read(Nm),
  11. % retract( Term ) - удаляет первый факт из базы данных, который соответствует заданному факту Term.
  12. retract(worker(Nm,_,_,_,_,_)).
  13. % consult - добавление некоторого факта через консоль или из файла к уже имеющемуся списку фактов в бд
  14. menuitem('3'):-consult('base.pl'). % подключает файл base.pl - ? (вопрос)
  15. % listing(Name) - распечатка содержащихся в программе предикатов с именем Name.
  16. menuitem('4'):-listing(worker),write('press return'),get_char(_).
  17. menuitem('5'):-writeln('--- save ---'),
  18. % tell(X) - открывает файл X, если он еще не открыт, и определяет, что текущим выходным потоком данных,
  19. % в который производится запись, является указанный файл
  20. tell('base.pl'),listing(worker),told.
  21. % told - Этот предикат закрывает текущий выходной поток данных (файл) и записывает маркер конца файла в соответствующий файл.
  22. Текущим выходным потоком данных становится дисплей терминала ( user ).
  23. menuitem('6'):-writeln('--- search'),
  24. write('enter name:'),read(Num),
  25. worker(Nm,Num,_,_,_,_), writeln(Nm),fail;true.
  26. menuitem('7'):-retractall(worker(_,_,_,_,_,_)),writeln('--- cleared').
  27. menu:- repeat, nl,
  28. writeln('1-add'),
  29. writeln('2-delete'),
  30. writeln('3-load'),
  31. writeln('4-output'),
  32. writeln('5-save'),
  33. writeln('6-search'),
  34. writeln('7-clear'),
  35. writeln('0-exit'),
  36. write('->'),readchar(Num), menuitem(Num),Num='0'.
  37. %внутренняя цель
  38. :-menu.
В прологе только осваиваюсь и не могу вникнуть в некоторые вещи, подскажите кто знает: 1) как подключить внешнюю бд, вернее как верно указать адрес к нему по директориям, файл base.pl выше в тексте прог-мы 2) не выходит вывести один факт отдельно по имени рабочего, пункт меню 6 3) не выходит добавить или удалить пункт 1, 2 (пример - пишу 2, мне выводится enter name, дальше пишем ann и выводится
Листинг программы
  1. ERROR: Stream user_input:27:15 Syntax error: Operator expected
  2. Warning: Goal (directive) failed: user:menu
  3. % dz compiled 0.00 sec, 14 clauses
  4. true.
) пример диалога:
Листинг программы
  1. ->2
  2. --- delete ---
  3. enter name:ann.
  4. ERROR: Stream user_input:27:15 Syntax error: Operator expected
  5. Warning: Goal (directive) failed: user:menu
  6. % dz compiled 0.00 sec, 14 clauses
  7. true.
Подскажите в чем может быть ошибка " Stream user_input:27:15 Syntax error: Operator expected" ? Спасибо.

Решение задачи: «Создать БД, предикаты в которой имеют ряд атомов»

textual
Листинг программы
  1. 1

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


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

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

9   голосов , оценка 4.556 из 5

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

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

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