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

Ваш аккаунт

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

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

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

Помогите решить задачу на прологе

56K
07 января 2010 года
ijk987
1 / / 07.01.2010
Привет всем! Помогите, пожалуйста, решить на прологе следующую задачу (или подкиньте идею, как решать).
Борисов, Кириллов, Данин, Савин - инженеры. Один из них - автомеханик, другой - химик, третий - строитель, четвертый - радиотехник. Известны следующие десять фактов:
1) Борисов обыгрывает в шахматы Данина
2) Савин обыгрывает в шахматы Борисова
3) Борисов бегает на лыжах быстрее того инженера, который моложе него
4) Борисов ходит в театр вдвое чаще, чем тот инженер, который старше Кириллова
5) Химик посещает театр вдвое чаще, чем автомеханик
6) Химик не самый старый и не самый молодой
7) Радиотехник бегает на лыжах быстрее, чем строитель
8) Автомеханик обыгрывает в шахматы строителя
9) Самый старый обыгрывает всех в шахматы
10) Самый молодой быстрее всех бегает на лыжах
Необходимо назвать профессии каждого из инженеров, если известно, что ни в спорте, ни в приверженности к театру среди них нет двух одинаковых.
Поскольку смысл последнего условия про приверженность к спорту и театру не смог объяснить даже выдавший задачу, то его можно проигнорировать.

Я действовал следующим образом:
1) составил список необходимых предикатов:
chess(symbol,symbol) - первый обыгрывает в шахматы второго
theatre(symbol,symbol) - первый ходит в театр чаще второго
skiing(symbol,symbol) - первый бегает на лыжах быстрее второго
younger(symbol,symbol) - первый моложе второго
chemist(symbol) - химик
mechanic(symbol) - автомеханик
technician(symbol) - радиотехник
builder(symbol) - строитель

2) к каждому исходному факту составил равносильные ему:
1) chess(borisov,danin).
2) chess(savin,borisov).
3) skiing(borisov,X):-younger(X,borisov).
younger(X,borisov):-skiing(borisov,X).
4) theatre(borisov,X):-younger(kirillov,X).
younger(kirillov,X):-theatre(borisov,X).
5) chemist(X):-mechanic(Y),theatre(X,Y).
mechanic(X):-chemist(Y),theatre(Y,X).
theatre(X,Y):-chemist(X),mechanic(Y).
6) chemist(X):-younger(_,X),younger(X,_).
7) technic(X):-builder(Y),skiing(X,Y).
builder(X):-technic(Y),skiing(Y,X).
skiing(X,Y):-technic(X),builder(Y).
8) mechanic(X):-builder(Y),chess(X,Y).
builder(X):-mechanic(Y),chess(Y,X).
chess(X,Y):-mechanic(X),builder(Y).
9) chess(X,_):-not(younger(X,_)).
10) skiing(X,_):-not(younger(_,X)).

3) затем определил каждый предикат (что оказалось возможно единственным образом):
chess(borisov,danin).
chess(savin,borisov).
younger(X,borisov):-skiing(borisov,X).
theatre(borisov,X):-younger(kirillov,X).
mechanic(X):-chemist(Y),theatre(Y,X).
chemist(X):-younger(_,X),younger(X,_).
technic(X):-builder(Y),skiing(X,Y).
builder(X):-mechanic(Y),chess(Y,X).
chess(X,_):-not(younger(X,_)).
skiing(X,_):-not(younger(_,X)).

4) с небольшими исправлениями составил программу на прологе, которая переполнила стек.

Помогите, плиз!!!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог