Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

обработка базы данных Visual Prolog 5.2

37K
13 октября 2010 года
psyxo
33 / / 26.04.2009
доброго времени суток! написал задачку на прологе с базой данных.
решения выводятся не на все предикаты разом, а только если рассматривать их по одному и ещё в третьем вопросе выдаёт ошибку. Подскажите, пожалуйста, как всё это исправить. Заранее благодарен!

/* Предметная область – биржа труда. Каждая вакансия может быть описана структурой: название предприятия,
должность, ежемесячный доход, требования к соискателю, список соискателей.
Каждый соискатель может быть описан структурой: фамилия, имя отчество, соответствие требованиям.
Требования к соискателю и соответствие требованиям могут быть описаны одной структурой:
образование, возраст, пол, владение иностранными языками, умение работать на ПК,
стаж работы по специальности.
Реализовать следующие типы запросов:
1. Найти должность, для которой существует максимальное число соискателей;
2. Найти все должности для мужчин, с высшим образованием и свободно владеющих иностранным языком;
3. Найти все предприятия, предлагающие доход выше указанного уровня;
4. Найти все вакансии для женщин, умеющих работать на ПК, и имеющих стаж работы более 5 лет;
5. Найти предприятие, у которого больше всего вакансий.

*/
Код:
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
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог