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