На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Поиск информации в базе данных Visual Prolog , Помогите пожалуйста исправить программу
    Народ, помогите пожалуйста кто может. Вот задание:



    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).
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0483 ]   [ 14 queries used ]   [ Generated: 18.07.25, 00:42 GMT ]