domains
вакансия=вакансия(предприятие,должность,доход,требования,список_соискателей)
требования=требования(образование,возраст,пол,языки,компьютер,стаж)
соискатель=соискатель(ф,и,о,требования)
список_соискателей=соискатель*
ф,и,о,должность,пол,языки,компьютер,образование=string
предприятие=symbol
возраст,доход,стаж=integer
s=symbol*
l=integer*
facts
dbfind1(должность,возраст)
dbfind2(должность)
dbfind3(предприятие)
dbfind4(предприятие,должность,доход,требования)
dbfind5(symbol,integer)
максимум(integer,symbol)
dcount(integer)
predicates
вопрос1
вопрос2
вопрос3(доход)
вопрос4
вопрос5
dbvacancy(вакансия)
подсчёт(список_соискателей,integer)
список(s)
поиск1(integer,symbol,s)
сравнение(integer,symbol)
clauses
dbvacancy(вакансия(офис,"сисадмин", 20000,требования("высшее", 30,"м","да","да",2 ),[соискатель("иванова","а","б",требования("высшее",29,"м","нет","да",2)),соискатель("маяковский","г","в",требования("высшее",27,"м","да","да",1))])).
dbvacancy(вакансия(офис,"программист", 30000,требования("высшее", 28,"м","да","да",3 ),[соискатель("робинсон","г","б",требования("высшее",27,"м","да","да",1)),соискатель("григанов","в","в",требования("высшее",26,"м","да","да",3))])).
dbvacancy(вакансия(офис,"уборщица", 15000,требования("среднее", 25,"ж","нет","нет",0),[соискатель("крылова","в","г",требования("среднее",25,"ж","нет","нет",0)),соискатель("михалкова","а","а",требования("среднее",27,"ж","нет","нет",5))])).
dbvacancy(вакансия(школа,"учитель", 18000,требования("высшее", 27,"ж","да","да",5 ),[соискатель("гимранова","а","в",требования("высшее",25,"ж","да","да",6)),соискатель("пугачёва","а","б",требования("высшее",25,"ж","да","да",7)),соискатель("салтыкова","с","с",требования("высшее",30,"ж","да","да",7))])).
подсчёт([],0).
подсчёт([Head|Tail],N):- подсчёт(Tail,N1), N=N1+1.
dbfind5("",0).
список([]):-dbfind5(A,B),write(A,"=",B),nl.
список([H|T]):-поиск1(1,H,T),список(T).
поиск1(K,H,[H|T]):-K1=K+1,поиск1(K1,H,T).
поиск1(K,H,[N|T]):-поиск1(K,H,T).
поиск1(K,H,[]):-сравнение(K,H).
сравнение(K,H):-dbfind5(C,D),K>=D,retract(dbfind5(C,D)),assert(dbfind5(H,K)).
сравнение(K,H).
максимум(0,a).
вопрос1 :- dbvacancy(вакансия(_,Должность, _,требования(_, _,_,_,_,_ ),L)),подсчёт(L,N),максимум(N1,Должность1),N>N1,retract(максимум(N1,Должность1)),assert(максимум(N,Должность)),fail.
вопрос2:- dbfind2(Должность),write(Должность,"*"),nl,fail.
вопрос2 :-not(dbfind2(_)),dbvacancy(вакансия(_,Должность, _,требования("высшее", _,"м","да",_,_ ),_)),assert(dbfind2(Должность)),write(Должность),nl,fail.
вопрос3(Доход):- dbfind3(предприятие), write(Предприятие,"*"),nl,fail.
вопрос3(Доход) :- not(dbfind3(_)), dbvacancy(вакансия(Предприятие,_,N,требования(_, _,_,_,_,_ ),_)),Доход<N,assert(dbfind3(Предприятие)),write(Предприятие),nl,fail.
вопрос4:- dbfind4(Предприятие,Должность,Доход,Требования), write(Предприятие,"*",Должность,"*",Доход,"*",Требования),nl,fail.
вопрос4 :-not(dbfind4(_,_,_,_)),dbvacancy(вакансия(Предприятие,Должность,Доход,Требования,_)),Требования=требования(_, _,"ж",_,"да",N),N>5,assert(dbfind4(Предприятие,Должность,Доход,Требования)),write(Предприятие," ",Должность," ",Доход," ",Требования),nl,fail.
вопрос5:- findall(Предприятие,dbvacancy(вакансия(Предприятие,_,_,требования(_, _,_,_,_,_ ),_)),S),список(S).
goal
not(вопрос1),максимум(Число_соискателей_равно,На_должность).
вопрос2,
вопрос3(18000),
вопрос4.
вопрос5
обработка базы данных Visual Prolog 5.2
решения выводятся не на все предикаты разом, а только если рассматривать их по одному и ещё в третьем вопросе выдаёт ошибку. Подскажите, пожалуйста, как всё это исправить. Заранее благодарен!
/* Предметная область – биржа труда. Каждая вакансия может быть описана структурой: название предприятия,
должность, ежемесячный доход, требования к соискателю, список соискателей.
Каждый соискатель может быть описан структурой: фамилия, имя отчество, соответствие требованиям.
Требования к соискателю и соответствие требованиям могут быть описаны одной структурой:
образование, возраст, пол, владение иностранными языками, умение работать на ПК,
стаж работы по специальности.
Реализовать следующие типы запросов:
1. Найти должность, для которой существует максимальное число соискателей;
2. Найти все должности для мужчин, с высшим образованием и свободно владеющих иностранным языком;
3. Найти все предприятия, предлагающие доход выше указанного уровня;
4. Найти все вакансии для женщин, умеющих работать на ПК, и имеющих стаж работы более 5 лет;
5. Найти предприятие, у которого больше всего вакансий.
*/
Код: