
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#1
,
|
|
|
Народ, помогите пожалуйста кто может. Вот задание:
1. Создать базу данных о заданной предметной области в виде множества фактов языка Пролог (не менее 5 фактов). Информацию о каждом компоненте БД представить в виде структуры. 2. Разработать набор предикатов, осуществляющих взаимодействие с БД, при помощи которых можно реализовать все типы запросов, приведенные в варианте задания. Найденные решения записать в виде фактов внутренней базы данных Пролога. 3. Предусмотреть проверку факта, являющегося ответом на запрос в БД. Если такой факт существует, то выдать его в качестве ответа на запрос. Если такого факта не существует в базе данных, то запустить запрос на выполнение и записать результат в БД. Предметная область – страны мира. Каждая страна может быть описана структурой: название, площадь, географическое положение, население. Географическое положение может быть описана структурой: часть света, материк, океаны, моря, горные хребты. Население может быть описано структурой: численность, государственный язык, национальный состав. Национальный состав может быть описан структурой: национальность, численность, процент от всего населения. Реализовать следующие типы запросов: 1. Найти страну, которую омывает больше всего морей; 2. Найти все страны, на территории которых находится указанный горный хребет; 3. Найти все страны, у которых число национальностей превышает заданную величину; 4. Найти все горные хребты, находящиеся на территории указанной страны; 5. Найти все страны, у которых численность населения меньше заданной величины. Запросы 1 и 2 я сделал в виде фактов, а как это сделать с остальными запросами я не знаю Вот программа: 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). |