Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Очень нужна нужна помощь в решении задачи
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
Question 15.01.2009, 00:22

Здравствуйте

Уезжаю на сессию 16 числа и не сделано всего одно задание - по логическому программированию. Если кто сможет - хотя бы самое элементарное...
1. Предметная область "Студенты группы".
Отношения- факты:
<студент>(<номер зачетной книжки>,<ФИО>,<группа>).
<возраст>(<номер зачетной книжки>,<возраст>).
<рост>(<номер зачетной книжки>,<рост>).
<вес>(<номер зачетной книжки>,<вес>).
Отношения - правила: какими характеристиками(рост,вес,возраст) обладает студент определенной группы, кто в группе кого старше, выше, тяжелее и т.д.
2. Для своей программы, полученной в процессе выполнения задания №1:
• построить И-ИЛИ-дерево для двух запросов;
• использовать «;» для вызова возврата;
• проследить на И-ИЛИ-дереве за неудачей и возвратом;
• осуществить трассировку выполнения программы при тех же целевых утверждениях, что и в предыдущих пунктах, и сравнить полученные результаты с анализом по И-ИЛИ-дереву;
• описать на примере одного запроса алгоритм работы интерпретатора, включая фазу возврата.
3. Пример. Cоставить программу вычисления значений
Y1=(A1+B1)/D-A1 mod B1-C13, Y2=L2-A1/B1+L/(D+C1).
где V=3, A=20, R=8, Q=2, E=13, и установления соотношения между ними Y1 @ Y2. Предусмотреть возможность ввода исходных данных как с клавиатуры терминала, так и из файла на диске. Результаты также должны быть получены сначала на терминале, а затем на устройстве печати. Для осуществления последней операции необходимо результаты вывести в файл на диске с именем «T.TXT».

Открыл методичку, а там перед этим заданием только какой то пример про блюда рассматривается, а о каких то сортировках и максимальных элементах даже речи нет. Чуть не ахнул когда увидел... Самое забавное что что это первое задание по первой теме, а про такое как вывод информации на экран рассматривается только в 4 теме. Язык и стиль исполнения не важен (любой вид Пролога). Не дайте пропасть бедному студенту... Пытался реализовать сам, убил сутки, но кроме ошибок так ничего и не добился. Слишком уж специфичная вещь.

С уважением,
Виталий
Ответить с цитированием
  (#2 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 03:44

aaq среди ночи любезно набросал код собирания в группу и вывод на экран. Что где то 70% от первого задания.
Код:
DOMAINS
s=string  sl=s*
i=integer il=i*

DATABASE
student(i,s,i,i,i,i)

PREDICATES
showGroup(i)
writeGroup(sl)

CLAUSES

showGroup(Group):- 

findall(Name,student(_,Name,Group,_,_,_),GroupList),
              
writeGroup(GroupList).

writeGroup([]):-!.
writeGroup([Name|Anothers]):- nl, write(Name), writeGroup(Anothers).

student(111, "Vasya", 593, 20, 178, 75).
student(222, "Petya", 593, 19, 180, 70).
student(333, "Masha", 666, 21, 169, 70).
student(444, "Misha", 263, 18, 179, 90).
student(555, "Katya", 563, 20, 183, 70).
student(666, "Ibragim", 463, 21, 172, 71).
student(777, "Bonifatziy", 666, 24, 173, 60).
student(888, "Karmen", 463, 22, 176, 78).
student(999, "Irena", 666, 22, 189, 120).
student(001, "Kolya", 263, 25, 181, 115).
student(122, "Suliko", 593, 19, 179, 70).
student(232, "Navukhodonosor", 263, 19, 170, 73).
Пытаюсь разобраться что к чему... Но боюсь не успею, чтобы продолжить. Хотя в принципе логика мне вполне ясна, но вот повторить вряд ли смогу вот так.
Ответить с цитированием
  (#3 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 04:17

Предикат max, выбирающий максимальное значение из двух элементов:
max( X, Y, X ):– X >= Y.
max( X, Y, Y ):– X < Y.
Результативный предикат maxlist(LIST, MAX), где MAX – наибольший элемент списка LIST, выглядит следующим образом:
maxlist( [ X ], X ).
maxlist( [ X, Y | TAIL ], MAX ) :–
maxlist( [ Y | TAIL ], MAXTAIL ),
max( X, MAXTAIL, MAX ).
Ответить с цитированием
  (#4 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 04:35

Отлаженный на любые исключения код это конечно хорошо, но больше как для восприятия, так и по выполнению подошла бы программа, просто делающая заданное. Условий на это не стоит и придумывать думаю их не стоит)
Ответить с цитированием
  (#5 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 04:51

Касаемо первого задания.
Выводим группу, с указанием "чемпионов" по весу, росту и возрасту.
Что то вроде:
Группа 593
Иванов
Петров (самый толстый в группе)
Сидоров (самый старый в группе)
Перепелица
Забубякин (самый высокий в группе)
То есть деление только внутри группы, а не за её пределами

Или же так

Группа 593
Иванов
Петров
Сидоров
Перепелица
Забубякин
Самый толстый - Петров
Самый старый - Сидоров
Самый высокий - Забубякин
...
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 15.01.2009, 05:11

гм... а чё с последующими пунктами задания, я никак не соображу...
Ответить с цитированием
  (#7 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 15.01.2009, 05:57

запрос на самых старых-молодых
Код:
DOMAINS
s=string  sl=s*
i=integer il=i*

DATABASE
student(i,s,i,i,i,i)


PREDICATES
vozrast(i, % запрошиваемая группа
        sl,% список самых молодых
        i, % самый маленький возраст
        sl,% список самых старых
        i) % самый большой возраст

getMinMax(il,i,i)
pull(i,i,i,i,i)


CLAUSES

vozrast(Gr,Molod,Min,Staryi,Max):- 
findall(Vozr,student(_,_,Gr,Vozr,_,_),VozList),
getMinMax(VozList,Min,Max),
findall(Name,student(_,Name,Gr,Min,_,_),Molod),
findall(Name,student(_,Name,Gr,Max,_,_),Staryi).


getMinMax([],999,0):-!.
getMinMax([G|H],Min,Max):- getMinMax(H,Mi,Ma), pull(G,Mi,Ma,Min,Max). 

pull(X,999,0,X,X):-!.
pull(X,Mi,Ma,X,Ma):- X<Mi,!.
pull(X,Mi,Ma,Mi,X):- X>Ma,!.
pull(_,Mi,Ma,Mi,Ma).


student(111, "Vasya", 593, 20, 178, 75).
student(222, "Petya", 593, 19, 183, 70).
student(333, "Masha", 666, 21, 169, 70).
student(444, "Misha", 263, 18, 179, 90).
student(555, "Katya", 563, 20, 183, 70).
student(666, "Ibragim", 463, 21, 172, 71).
student(777, "Bonifatziy", 666, 24, 173, 60).
student(888, "Karmen", 463, 22, 176, 78).
student(999, "Irena", 666, 22, 189, 120).
student(001, "Kolya", 263, 25, 181, 115).
student(122, "Suliko", 593, 19, 179, 70).
student(232, "Navukhodonosor", 263, 19, 170, 73).

и такой вот диалог
Цитата:
Goal: vozrast(593,X,Y,Z,Q)
X=["Petya","Suliko"], Y=19, Z=["Vasya"], Q=20
1 Solution
Goal: vozrast(666,X,Y,Z,Q)
X=["Masha"], Y=21, Z=["Bonifatziy"], Q=24
1 Solution
Goal: vozrast(263,X,Y,Z,Q)
X=["Misha"], Y=18, Z=["Kolya"], Q=25
1 Solution
Goal: vozrast(563,X,Y,Z,Q)
X=["Katya"], Y=20, Z=["Katya"], Q=20
1 Solution
Goal: vozrast(463,X,Y,Z,Q)
X=["Ibragim"], Y=21, Z=["Karmen"], Q=22
1 Solution
хотя в 7-ке уже куча встроенного, должно быть и поиск максимального-минимального в поле...
Ответить с цитированием
  (#8 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 06:01

Вот это да...) В принципе из самого старого сделать самого толстого или высокого труда не составит) Огромное спасибо!
Ответить с цитированием
  (#9 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 15.01.2009, 06:04

куча похожих запросов -- должны унифицироваться...
Ответить с цитированием
  (#10 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 06:10

Жаль, но 7 мне показалась нечто запредельным... Людей, которые действительно могут на ней работать здесь не так уж и много... Может появится всемогущий Винитарх, переведёт данный код в формат версии 7 и выдаст нам 3-4 строки всего) Было бы конечно запредельно). Вроде как вчера он сказал что сегодня повлияет на данную ситуацию. Вот и увидим разницу между подходом и реализацией.
Ответить с цитированием
  (#11 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 15.01.2009, 06:19

Винитарх вместо Вас въезжать в специфику пролога не будет!!! Вы поздно начали, если "завтра" уже сессия -- время, конечно, на это потребуется. И начинать неплохо бы с чего попроще...
Ответить с цитированием
  (#12 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 06:23

Цитата:
Винитарх вместо Вас въезжать в специфику пролога не будет!!! Вы поздно начали, если "завтра" уже сессия -- время, конечно, на это потребуется. И начинать неплохо бы с чего попроще...
Никто вместо меня куда то въезжать и не должен. Особенно когда речь идёт о Вас и Винитархе. Сессия начинается 16.01.09 и я не соврал если что... Знаний в голову мне никто не вобьёт. Что мне нужно сейчас - рабочий код программы и материал для будущих размышлений. Если думаете что мне всё это приятно, то я приношу Вам свои извинения. Я взялся за познание Пролога сразу с 7 версии. С одной стороны это должно было облегчить задачу (например всё тот же поиск минимального и максимального), а с другой главного смысла я по сути так и не уловил. Не серчайте на меня...
P.S. Ещё раз огромное спасибо за помощь. Таких людей реально мало сейчас...
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 15.01.2009, 06:37

да я и не серчаю...плюнте...
Код:
vozrast(Gr,Molod,Min,Staryi,Max):- 
findall(Vozr,student(_,_,Gr,Vozr,_,_),VozList),
getMinMax(VozList,Min,Max),
findall(Name,student(_,Name,Gr,Min,_,_),Molod),
findall(Name,student(_,Name,Gr,Max,_,_),Staryi).
вообще-то, некрасиво как-то -- слишком много findall()-ов -- раз за разом по всей базе юлозит... Да и по именам гуляем, а ключ здесь номер зачётки -- безобразие.

так, наверное, лучше, по-универсальному
Код:
DOMAINS
s=string  sl=s*
i=integer il=i*   

DATABASE
student(i,s,i,i,i,i)

PREDICATES
zapros(i, % параметр 1-возраст, 2-рост, 3-масса
       i, % номер группы
       il,% список последних по параметру
       i, % самое малое значение параметра
       il,% список первых по.....
       i) % самое большое......

getMinMax(i,il,il,i,il,i)
pull(i,i,il,i,il,i,il,i,il,i)
getValuy(i,i,i)


CLAUSES

zapros(Param,Gr,MinList,Min,MaxList,Max):- 
findall(Number,student(Number,_,Gr,_,_,_),NList),
getMinMax(Param,NList,MinList,Min,MaxList,Max).


getMinMax(_,[],[],999,[],0):-!.
getMinMax(Param,[G|H],MinList,Min,MaxList,Max):- 
getMinMax(Param,H,MiList,Mi,MaList,Ma), 
getValuy(Param,G,Valuy),
pull(G,Valuy,MiList,Mi,MaList,Ma,MinList,Min,MaxList,Max). 


pull(G,X,_,999,_,0,[G],X,[G],X):-!.
pull(G,X,MiList,Mi,MaList,Ma,[G],X,MaList,Ma):- X<Mi,!.
pull(G,X,MiList,Mi,MaList,Ma,[G|MiList],X,MaList,Ma):- X=Mi,!.
pull(G,X,MiList,Mi,MaList,Ma,MiList,Mi,[G],X):- X>Ma,!.
pull(G,X,MiList,Mi,MaList,Ma,MiList,Mi,[G|Malist],X):- X=Ma,!.
pull(_,_,MiList,Mi,MaList,Ma,MiList,Mi,Malist,Ma).


getValuy(1,G,V):- student(G,_,_,V,_,_).
getValuy(2,G,V):- student(G,_,_,_,V,_).
getValuy(3,G,V):- student(G,_,_,_,_,V).


student(111, "Vasya", 500, 20, 178, 75).
student(222, "Petya", 500, 19, 183, 70).
student(333, "Masha", 500, 21, 169, 70).
student(444, "Misha", 200, 18, 179, 90).
student(555, "Katya", 200, 20, 183, 70).
student(666, "Ibragim", 400, 21, 172, 71).
student(777, "Bonifatziy", 400, 24, 173, 60).
student(888, "Karmen", 400, 22, 176, 78).
student(999, "Irena", 400, 22, 189, 120).
student(001, "Kolya", 200, 25, 181, 115).
student(122, "Suliko", 500, 19, 183, 70).
student(232, "Navukhodonosor", 200, 19, 170, 73).
диалог
Цитата:
Goal: zapros(1,500,MiL,Min,MaL,Max)
MiL=[222,122], Min=19, MaL=[333], Max=21
1 Solution
Goal: zapros(2,500,MiL,Min,MaL,Max)
MiL=[333], Min=169, MaL=[222,122], Max=183
1 Solution
Goal: zapros(3,500,MiL,Min,MaL,Max)
MiL=[222,333,122], Min=70, MaL=[111], Max=75
1 Solution
Goal: zapros(2,200,MiL,Min,MaL,Max)
MiL=[232], Min=170, MaL=[555], Max=183
1 Solution
Goal: zapros(1,400,MiL,Min,MaL,Max)
MiL=[666], Min=21, MaL=[777], Max=24
1 Solution
Goal: zapros(3,400,MiL,Min,MaL,Max)
MiL=[777], Min=60, MaL=[999], Max=120
1 Solution
Ответить с цитированием
  (#14 (permalink)) Старый
NecroDevil NecroDevil вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.01.2009
По умолчанию 15.01.2009, 13:16

Не совсем понимаю результатом чего является MiL=[222,333,122], Min=70, MaL=[111], Max=75? Или она ищет вне групп?
Ответить с цитированием
  (#15 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 15.01.2009, 17:23

Цитата:
Goal: zapros(3,500,MiL,Min,MaL,Max)
-- запрос по 3 параметру (вроде называли его "вес"), группа №500

Цитата:
student(111, "Vasya", 500, 20, 178, 75).
student(222, "Petya", 500, 19, 183, 70).
student(333, "Masha", 500, 21, 169, 70).
............
.............
student(122, "Suliko", 500, 19, 183, 70).
все в одно группе №500, MiL=[222,333,122] -- вес по по 70 кг. -- что для группы минимум, а зачётка №111 вес 75, что для группы максимум
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь в решении задачи AndreySuslov Prolog 4 18.05.2012 20:02
Нужна помощь при решении проблем в Аксесс Дарын Другие СУБД 0 08.12.2011 13:45
ОЧЕНЬ НУЖНА ПОМОЩЬ В РЕШЕНИИ 3 ЗАДАЧ. Тизраэль Pascal 2 13.01.2011 13:30
нужна помощь! очень нужна! ulana999i999 Prolog 0 17.04.2010 14:13
Нужна помощь знающих людей в решении логической задачи dzh0n Prolog 4 30.11.2007 21:49
Нужна помощь програмиста в решении задачи по VBA Dianira Задания за деньги 1 24.05.2006 23:48
Нужна помощь програмиста в решении задачи Dianira Visual Basic 2 24.05.2006 22:21
Нужна помощь в решении задач на С++ loginN Вопросы начинающих программистов 0 19.01.2005 03:54
Нужна помощь в решении задаче домино CATik Prolog 15 12.11.2004 10:31
Нужна помощь в решении задач Katafalk Prolog 6 15.06.2004 23:11
Нужна помощь в решении задачи ващ Prolog 27 16.03.2004 15:09
Нужна помощь в решении задачи woland Алгоритмы 1 21.11.2003 13:05



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов