• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Задача на ПРОЛОГ-Д

ШуриK

Новые
Регистрация
5 Фев 2009
Сообщения
2,602
Реакции
39
Баллы
0
Задача на ПРОЛОГ-Д

Здравствуйте, вот надо сделать задачу на данном языке программирования, если кто-нибудь изучал, помогите решить вопрос о взаимосвязи родственников, имеем:
мама(Оля,Сергей)
папа(Бронислав, Сергей)
брат(Саня,Сергей)
сестра(Наталья,Сергей)
бабушка(Груня,Сергей)

Описание родственников идет от имени Сергея, у его есть папа,мама, брат, сестра, бабушка. А как установить правило, что они все родственники, т.е. нужно задать вопрос кто является мамой у сестры Натальи, ну и получить ответ Оля. Вариант с описанием всех родственников не катит, т.к. "это слишком просто"
 
Вариант с описанием родственников не катит - имеется ввиду втупую прописать мама(Оля, Наталья) или имеется ввиду что-то другое?
Установить что они родственники - имеется ввиду полный набор? Просто есть набольшая проблема - бабушка она чья мама? Оли или Бронислава? Или нужно только для младшего поколения?
 
Фу, я думал никто не поможет. Вариант, что прописать типа:
мама(Оля,Сергей)
мама(Оля,Саня)
мама(Оля,Наталья)
папа(Бронислав, Сергей)
папа(Бронислав, Саня)
папа(Бронислав, Наталья)
брат(Саня,Сергей)
брат(Сергей,Саня)
и т.п.
Не катит, т.к. больно просто, надо установить связь между всеми родственниками, что Саня Сергей и Наталья они друг другу братья и сестры, и что Оля и Бронислав являются тоже ссответсвенно мамой и папой Наталье и Сане, а бабушку выкинуть вобще можно. Связь родственников типа:

мама(Оля,Сергей):-брат(Саня,Сергей)

И чтоб потом можно было задать вопрос кто является мамой или папой Сани и Натальи. Вот. Связь я не знаю как установить, т.к. нам сказали делайте лабы и все. Перепробывал все варианты.
 
Тут нужно использовать переменные (начинаются с заглавных букв или с символа подчеркивания).
Для определения кто чья мама подойдёт такое описание:
мама(X, Y) :- брат(Y, Z), мама(X, Z).
мама(X, Y) :- сестра(Y, Z), мама(X, Z).

Что по русски звучит "X - мама Y при условии, что Y - брат Z, а X - мама Z"
И то же самое для сестры.

Где-то через час будет минутка - напишу целиком код программы для определения кто чей мама\папа и сестра\брат.
 
В общем вот что получилось:

мама(X, Y) :- брат(Y, Сергей), мама(X, Сергей).
мама(X, Y) :- сестра(Y, Сергей), мама(X, Сергей).
папа(X, Y) :- брат(Y, Сергей), папа(X, Сергей).
папа(X, Y) :- сестра(Y, Сергей), папа(X, Сергей).

сестра(X, Y) :- НЕ(РАВНО(Y, Сергей)), сестра(X, Сергей), брат(Y, Сергей).
сестра(X, Y) :- НЕ(РАВНО(Y, Сергей)), сестра(X, Сергей), сестра(Y, Сергей).
брат(X, Y) :- НЕ(РАВНО(Y, Сергей)), брат(X, Сергей), брат(Y, Сергей).
брат(X, Y) :- НЕ(РАВНО(Y, Сергей)), брат(X, Сергей), сестра(Y, Сергей).

мама(Оля,Сергей).
папа(Бронислав, Сергей).
брат(Саня,Сергей).
сестра(Наталья,Сергей).

НО! Есть тут одна непонятка - написал прогу я исходя из того что ты в первом посте указал что всё описывается именно от имени Сергея.
Соответственно всё работает при таком раскладе нормально, но если ты попробуешь сообщить ему факт где будет указан не Сергей - будет косяк.
Сделал я это из расчета что бы не усложнять излишне прогу раз такие условия.
Если это не так - пиши, чего-нить придумаем!
 
Последнее редактирование:
Не, все гуд, даже если что-то не прокатит скажу чтоб объяснял тогда как пральна. Огромнейшее тебе СПАСИБО, никто вобще просто не знает как это сделать, выручил!
 
птица(x,y)<-взмах(x,y),птица(x,y);
взмах(x,y)<-вниз(x,y,1),вниз(x,y,0),вверх(x,y,1),вверх(x,y,0);
вниз(x,y,c)<-сдв(x,y,z,t,u,v),ЛИНИЯ(z,y,u,y,1);
вверх(x,y)<-сдв(x,y,z,t,u,v),ЛИНИЯ(x,y,z,t,1),ЛИНИЯ(x,y,u,v,1);
сдв(x,y,z,t,u,v)<-сдп(x,y,z,t),сдл(x,y,u,v);
сдп(x,y,z,t)<-СЛОЖЕНИЕ(x,5,z),СЛОЖЕНИЕ(t,5,y);
сдл(x,y,z,t)<-СЛОЖЕНИЕ(z,5,x),СЛОЖЕНИЕ(t,5,y);
дом(x,y)<-крыша(x,y,r,f), этаж(x,y,f);
этаж(x,y,f)<-СЛОЖЕНИЕ(y,20,z),квадр(x,y,f,z);
крыша(x,y,r,f)<-СЛОЖЕНИЕ(r,10,y),СЛОЖЕНИЕ(x,20,f),треуг(x,y,r,f);
треуг(x,y,z,t)<-ЛИНИЯ(x,y,t,y,1),ДЕЛЕНИЕ2(x,t,f),угол(x,y,z,t,f);
угол(x,y,z,t,f)<-ЛИНИЯ(x,y,f,z,1),ЛИНИЯ(f,z,t,y,1);
ДЕЛЕНИЕ2(x,t,f)<-СЛОЖЕНИЕ(x,t,r),ДЕЛЕНИЕ(r,2,f);
квадр(x,y,z,t)<-ЛИНИЯ(x,y,x,t,1),ЛИНИЯ(x,y,z,y,1),ч2(x,y,z,t);
ч2(x,y,z,t)<-ЛИНИЯ(x,t,z,t,1),ЛИНИЯ(z,y,z,t,1);
птица(x,y)<-взмах(x,y),птица(x,y);
взмах(x,y)<-вниз(x,y,1),вниз(x,y,0),вверх(x,y,1),вверх(x,y,0);
вниз(x,y,c)<-сдв(x,y,z,t,u,v),ЛИНИЯ(z,y,u,y,1);
вверх(x,y)<-сдв(x,y,z,t,u,v),ЛИНИЯ(x,y,z,t,1),ЛИНИЯ(x,y,u,v,1);
сдв(x,y,z,t,u,v)<-сдп(x,y,z,t),сдл(x,y,u,v);
сдп(x,y,z,t)<-СЛОЖЕНИЕ(x,5,z),СЛОЖЕНИЕ(t,5,y);
сдл(x,y,z,t)<-СЛОЖЕНИЕ(z,5,x),СЛОЖЕНИЕ(t,5,y);

?дом(70,110),птица(120,50);

как это решать правильно на прологе -д ? ответ напишите на эл.почту
 
Назад
Сверху