Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Задача на ПРОЛОГ-Д (http://www.tehnari.ru/f41/t22262/)

ШуриK 27.02.2009 23:38

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

Описание родственников идет от имени Сергея, у его есть папа,мама, брат, сестра, бабушка. А как установить правило, что они все родственники, т.е. нужно задать вопрос кто является мамой у сестры Натальи, ну и получить ответ Оля. Вариант с описанием всех родственников не катит, т.к. "это слишком просто"

csbwalker 03.03.2009 13:31

Вариант с описанием родственников не катит - имеется ввиду втупую прописать мама(Оля, Наталья) или имеется ввиду что-то другое?
Установить что они родственники - имеется ввиду полный набор? Просто есть набольшая проблема - бабушка она чья мама? Оли или Бронислава? Или нужно только для младшего поколения?

ШуриK 03.03.2009 22:36

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

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

И чтоб потом можно было задать вопрос кто является мамой или папой Сани и Натальи. Вот. Связь я не знаю как установить, т.к. нам сказали делайте лабы и все. Перепробывал все варианты.

csbwalker 04.03.2009 12:37

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

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

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

csbwalker 04.03.2009 14:01

В общем вот что получилось:

мама(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, Сергей).

мама(Оля,Сергей).
папа(Бронислав, Сергей).
брат(Саня,Сергей).
сестра(Наталья,Сергей).
НО! Есть тут одна непонятка - написал прогу я исходя из того что ты в первом посте указал что всё описывается именно от имени Сергея.
Соответственно всё работает при таком раскладе нормально, но если ты попробуешь сообщить ему факт где будет указан не Сергей - будет косяк.
Сделал я это из расчета что бы не усложнять излишне прогу раз такие условия.
Если это не так - пиши, чего-нить придумаем!

ШуриK 04.03.2009 15:37

Не, все гуд, даже если что-то не прокатит скажу чтоб объяснял тогда как пральна. Огромнейшее тебе СПАСИБО, никто вобще просто не знает как это сделать, выручил!

marina_khv 27.11.2009 04:32

птица(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);

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

marina_khv 27.11.2009 04:33

zaj-07@mail.ru


Часовой пояс GMT +4, время: 20:12.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.