Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск информации в базе данных, Поправьте готовую программу 
:(
    Опции темы
fenix63
Дата 22.11.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, помогите пожалуйста кто может. Вот задание:



1.    Создать базу данных о заданной предметной области в виде множества фактов языка Пролог (не менее 5 фактов). Информацию о каждом компоненте БД представить в виде структуры.
2.    Разработать набор предикатов, осуществляющих взаимодействие с БД, при помощи которых можно реализовать все типы запросов, приведенные в варианте задания. Найденные решения записать в виде фактов внутренней базы данных Пролога.
3.    Предусмотреть проверку факта, являющегося ответом на запрос в БД. Если такой факт существует, то выдать его в качестве ответа на запрос. Если такого факта не существует в базе данных, то запустить запрос на выполнение и записать результат в БД.



Предметная область – страны мира. Каждая страна может быть описана структурой: название, площадь, географическое положение, население. Географическое положение может быть описана структурой: часть света, материк, океаны, моря, горные хребты. Население может быть описано структурой: численность, государственный язык, национальный состав. Национальный состав может быть описан структурой: национальность, численность, процент от всего населения.
Реализовать следующие типы запросов:
1.    Найти страну, которую омывает больше всего морей;
2.    Найти все страны, на территории которых находится указанный горный хребет;
3.    Найти все страны, у которых число национальностей превышает заданную величину;
4.    Найти все горные хребты, находящиеся на территории указанной страны;
5.    Найти все страны, у которых численность населения меньше заданной величины.



Запросы 1 и 2 я сделал в виде фактов, а как это сделать с остальными запросами я не знаю  smile 



Вот готовая программа:


domains
  world= world(country, square, geography, population)
  country = string
  countries=country*
  square = integer
  
  geography = geo(materic, oceans, seas, mountains)
   sea, ocean, mountain, continent, materic = string
   oceans = ocean*
   seas = sea*
   mountains = mountain*
   
  population = pop(quantity  , languages, nations)
   quantity, nquant, quant = integer
   quantities=quantity*
   language = string
   languages = language*
   
   nations = nat(nnames,nquantities, npercent)%National part
   nname = string
   nquantities=nquantity*
   npercent=percent*
   
   percent, nquantity = integer
   count, velichina=integer
   
   
  % list=integer*
  %lists=string*
  % Listint=integer*
   nnames=string*

facts
  max_Seas(country,byte) %Каждой стране даёт кол-во морей
  mount_Countries(country,mountain)% Определяет принадлежность конкретного горного хребта конкретной стране

predicates
owns(world)

  %owns(world(country, square, geography, population)
  counter( seas,byte) %Каждому списку морей вычисляет их количество
  member(mountains,mountain)%Определяет, совпадает ли  mountain с элементами списка mountains
  
  nat_count(nquantities,byte) %Определяет, превышает ли кол-во элементов списка nquantities число byte


  quant_count(quantities,byte) %Определяет, меньше ли кол-во элементов списка quantities чем число byte
  
  
  max_seas_country(Country)%1-st question
  mountain_countries(Mountain)%2-nd question
  national_count(Count)%3-th question
  gornie_hrebti(Country)%4-th question
  chislennost(Velichina)%5-th question
  
  
  
   
   clauses

      owns( world("Russia",1600,geo("Eurasia",["Atlantic","Pacific","Northern"],["Black","Barentsevo","Caspiy","Azov"],
               ["Caucasus","Altay","Ural","Camchat"]),pop(145,["Russian"],
               nat(["Russian","Tatari","Ukrain","Caucasus","Mordovthi"],[130,5,1,8,1],[90,2,1,6,1])))).
               
      owns(world("Poland",314,geo("Eurasia",[],["Baltic"],["Carpats","Sudets"]),pop(36,["Polish"],
               nat(["Russian","Polish"],[1,35],[2,98])))).
               
      owns(world("China",9597,geo("Eurasia",["Pacific"],["Yellow"],["Tibet","Himalayas","Carakums"]),
               pop(1030,["Chinese"],nat(["Chinese","Corean"],[1020,10],[99,1])))).
               
      owns(world("Egypt",1001,geo("Africa",[],["Red"],[]),pop(45,["Arab","English"],nat(["Arab","African"],[43,2],[98,2])))).

      owns(world("Usa",9363,geo("America",["Atlantic","Pacific"],["Bering"],["Apalach","Rocky"]),
               pop(232,["English","Spanish"],nat(["American","Spanish"],[222,10],[96,4])))).
                  
      owns(world("Argentina",2767,geo("America",["Atlantic","Pacific"],[],["Apalach"]),pop(28,["Spanish"],
               nat(["Argentin"],[23],[82])))).
                     
      owns(world("Australia",7686,geo("Australia",["Pacific"],["Tasman","Coral"],["Flinder","Tibet","Mcdonnel"]),
               pop(14,["English"],nat(["Australian","Newzealander"],[13,1],[97,3])))).
               
      owns(world("New Zeland",268,geo("Australia",["Pacific"],["Tasman"],["Coock"]),
               pop(3,["English"],nat(["Newzelands"],[3],[100])))).

           
   


/*-------------------------------The first question----------------------------------*/

counter([],0). %Если список пустой, то то его длина=1
counter([H|T],N):-counter(T,M),N=M+1. %Отделяем голову списка морей от хвоста, и в счётчик   %записываем N

   max_Seas("A",0). %Предпологаем, что это максимум
   
%retract – удаление факта из БД
%assertz – добавление факта в конец БД
%Тут идёт обычный алгоритм поиска максимума в массиве. Пусть max_Seas("A",0) – Страна с %максимальным кол-вом морей. Проходим по нашей БД. Если нам встречается страна с большим %кол-вом морей, то мы удаляем из БД старую страну (старый максимум), а новую страну (новый %максимум) записываем в конец БД. И потом выводим нашу страну на экран.



   max_seas_country(Country):- owns(world(Country,_,geo(_,_,L,_),_)),counter(L,N),
      max_Seas(Country1,N1), N>N1,retract( max_Seas(Country1,N1)),
      assertz(max_Seas(Country,N)),write(Country," ",N),nl.
   
   
/*-----------------------------------Second question-------------------------------*/
   member([H|_],H).
   member([_|T],X):-member(T,X).

   
  % mount_Countries("B","Tibet").%Strana i gornaya vershina
   
%Берём 1-ю страну из БД. Просматриваем список горных хребтов. Если нужный горный хребет в списке (предикат member), то выводим на экран страну. Также с остальными странами.


   mountain_countries(Mountain):-owns(world(Country,_,geo(_,_,_,L),_)),member(L,Mountain),write(Country),nl,fail.
   
   
/*----------------------------------3-th question------------------------------------*/

nat_count([],0).
nat_count([H|T],K):-nat_count(T,M),K=M+1.





%Смотрим 1-ю страну из БД. Смотрим список национальностей. Если кол-во элементов этого списка больше заданной величины, то выводим страну на экран. Также с остальными странами из БД.


national_count(Count):-owns(world(Country, _, _, pop(_  , _, nat(_,L, _))  )),nat_count(L,K),K>Count,write(Country),nl,fail.
national_count(_).
   
   

/*------------------------------4-th question-------------------------------------*/
%gornie_hrebti(Country):-owns(Country, _,geo(_, _, _, _) , _),write(mountains),nl.
%gornie_hrebti(Country):-findall(mountains,owns(Country, _,   geo(_, _, _, mountains), _),M_list   ),write(mountains),nl.

%У указанной страны просто распечатываем список горных хребтов
gornie_hrebti(Country):-owns(world(Country, _, geo(_, _, _, Mountains), _)),write(Mountains),nl.


/*----------------------------------------5-th question-------------------------------*/
quant_count([],0).
quant_count([H|T],K):-quant_count(T,M),K=M+1.

%chislennost(Velichina):-owns(Country, _, _, pop(Quantity  , _, _)),quant_count(L,K),K<Velichina,write(Country),nl,fail.
%chislennost(_).



%Последовательно проходим по БД. Если у текущей страны численность населения (Quantity) < заданной величины (Velichina), то выводим текущую страну на экран

chislennost(Velichina):-owns(world(Country, _, _, pop(Quantity, _, _))),Quantity<Velichina,write(Country),nl,fail.
chislennost(_).

goal
max_seas_country©,max_Seas(C,N).
%not(mountain_countries("Tibet")).
%national_count(2).
%gornie_hrebti("China").
%chislennost(100).

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

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

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


 




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


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

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