Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помоготе решить задачу 
V
    Опции темы
ijk987
Дата 7.1.2010, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.1.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) с небольшими исправлениями составил программу на прологе, которая переполнила стек.

Помогите, плиз!!!!!
 

PM MAIL   Вверх
Грымзик
Дата 7.1.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 7.10.2009

Репутация: 6
Всего: 6



У Вас переполнение вызывает такие предикаты как
skiing(borisov,X):-younger(X,borisov).
younger(X,borisov):-skiing(borisov,X).

тут бесконечная рекурсия. Я Вам могу помочь, но только завтра,
а если нет времени ждать, то я бы посоветовала бы сделать так:
есть структура
man(фамилия, место по возрасту, место в шахматах, место в лыжах, место в посещении театра)
где все места это цифры от 1 до 4. В последнем условии, по-моему, и имелось
в виду то, что цифры эти повторяться не будут. Генерировать
список этих элементов, а дальше уже проверять.
Генерить можно например так
Код

surname('Borisov').
surname('Kirilov').
surname('Danin').
surname('Savin').

surnames([H]):-surname(H).
surnames([H|Tail]):-surname(H),surnames(Tail),not(member(H,Tail)).

in14(1).
in14(2).
in14(3).
in14(4).

numbers14([]).
numbers14([H|Tail]):-numbers14(Tail),in14(H),not(member(H,Tail)).

gen(Men):-Men=[man(S1, Age1, Ch1, Sl1, Th1),man(S2, Age2, Ch2, Sl2, Th2),man(S3, Age3, Ch3, Sl3, Th3),man(S4, Age4, Ch4, Sl4, Th4)],
    surnames([S1,S2,S3,S4]),numbers14([Age1,Age2,Age3,Age4]), numbers14([Ch1,Ch2,Ch3,Ch4]),
    numbers14([Sl1,Sl2,Sl3,Sl4]), numbers14([Th1,Th2,Th3,Th4]).

PM MAIL   Вверх
ijk987
Дата 10.1.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Спасибо огромное!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.1443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.