Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу БД кандидатов в президенты
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
StarOver StarOver вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2011
По умолчанию БД кандидатов в президенты - 02.11.2011, 13:56

Доброго всем времени суток!
Только начал изучать язык Пролог и пока ещё мало что понимаю.
Пытаюсь решить следующую задачу:
Цитата:
Напишите программу содержащую базу данных по кандидатам в президенты. В базе данных должны содержаться следующие сведения:
ФИО, Дата рождения, Место рождения,
Фактическое место проживания, специальность, профессия, последнее место работы, избирательный округ, рейтинг, принадлежность к партии.
Программа должна выполнять следующие запросы:
Выдавать список кандидатов одной партии, строить диаграмму рейтинга, строить распределение по партиям.
Начал с того, чтобы программа хотя бы просто выдавала список кандидатов. Вот код:
Код:
domains
  name = person(symbol,symbol,symbol)                   /* (Last, First, Second) */
  birthday = b_date(symbol,integer,integer)          	/* (Month, Day, Year) */
  mesto_rozhdeniya = symbol				/* City */
  mesto_prozhivaniya = symbol                           /* City */
  spetsialnost = symbol					/* Education */
  professiya = symbol					/* Profession */
  mesto_raboty = symbol					/* Work */
  izbiratelny_okrug = symbol				/* Wote */
  reyting = string					/* Rate */
  prinadlezhnost_partii = symbol                        /* Party */
 
predicates
  person_list(name,birthday,mesto_rozhdeniya,mesto_prozhivaniya,spetsialnost,professiya,mesto_raboty,izbiratelny_okrug,reyting,prinadlezhnost_partii) - nondeterm (o,o,o,o,o,o,o,o,o,o)
  get_person_list - nondeterm ()
 
clauses
  get_person_list:-
        person_list(Name,Birthday,Mesto_rozhdeniya,Mesto_prozhivaniya,Spetsialnost,Professiya,Mesto_raboty,Izbiratelny_okrug,Reyting,Prinadlezhnost_partii),
        fail.
 
 
  person_list(person(putin,vladimir,vladimirovich),b_date(jan,3,1955),leningrad,moskva,yurist,prime_minister,pravitelstvo,peterburg,"0.55",edinaya_rossiya).
  person_list(person(zyuganov,gennadiy,andreevich),b_date(mar,3,1935),orel,moskva,uchitel,deputat,gosduma,moskva,"0.25",kprf).
  person_list(person(zhirinovskiy,vladimir,volfovich),b_date(apr,29,1951),almaata,moskva,yurist,deputat,gosduma,moskva,"0.15",ldpr).
  person_list(person(mironov,sergey,mikhaylovich),b_date(jan,3,1955),leningrad,moskva,inzhener,deputat,gosduma,peterburg,"0.05",spravedlivaya_rossiya).
  
 
goal
  get_person_list.
Программа работает, однако выдаёт только "no" (либо "yes", если убрать fail).
Подскажите, в чём ошибка, и как найти правильное решение?!
Спасибо заранее!
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 02.11.2011, 22:09

Не проверял, но должно работать:

domains
name = person(symbol,symbol,symbol) /* (Last, First, Second) */
birthday = b_date(symbol,integer,integer) /* (Month, Day, Year) */
mesto_rozhdeniya = symbol /* City */
mesto_prozhivaniya = symbol /* City */
spetsialnost = symbol /* Education */
professiya = symbol /* Profession */
mesto_raboty = symbol /* Work */
izbiratelny_okrug = symbol /* Wote */
reyting = string /* Rate */
prinadlezhnost_partii = symbol /* Party */

predicates
person_list(name,birthday,mesto_rozhdeniya,mesto_p rozhivaniya,spetsialnost,professiya,mesto_raboty,i zbiratelny_okrug,reyting,prinadlezhnost_partii) - nondeterm (o,o,o,o,o,o,o,o,o,o)
get_person_list - nondeterm ()

clauses
get_person_list:-
person_list(Name,Birthday,Mesto_rozhdeniya,Mesto_p rozhivaniya,Spetsialnost,Professiya,Mesto_raboty,I zbiratelny_okrug,Reyting,Prinadlezhnost_partii),
write(Name,Birthday,Mesto_rozhdeniya,Mesto_prozhiv aniya,Spetsialnost,Professiya,Mesto_raboty,Izbirat elny_okrug,Reyting,Prinadlezhnost_partii),nl,
fail;
true.

person_list(person(putin,vladimir,vladimirovich),b _date(jan,3,1955),leningrad,moskva,yurist,prime_mi nister,pravitelstvo,peterburg,"0.55",edinaya_rossi ya).
person_list(person(zyuganov,gennadiy,andreevich),b _date(mar,3,1935),orel,moskva,uchitel,deputat,gosd uma,moskva,"0.25",kprf).
person_list(person(zhirinovskiy,vladimir,volfovich ),b_date(apr,29,1951),almaata,moskva,yurist,deputa t,gosduma,moskva,"0.15",ldpr).
person_list(person(mironov,sergey,mikhaylovich),b_ date(jan,3,1955),leningrad,moskva,inzhener,deputat ,gosduma,peterburg,"0.05",spravedlivaya_rossiya).

goal
get_person_list.
Ответить с цитированием
  (#3 (permalink)) Старый
StarOver StarOver вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2011
По умолчанию 03.11.2011, 15:22

Винитарх, спасибо за программу! Правда, в таком виде она не работает, у вас разрывы в отдельных словах, но по сути всё верно! Я её отредактировал, лишние пробелы убрал, всё заработало! Единственное, что не удалось исправить - данные о кандидатах выводятся сплошной строкой, без пробелов или запятых. В любом случае спасибо! Буду думать дальше
Ответить с цитированием
  (#4 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.11.2011, 20:44

Цитата:
Сообщение от StarOver
у вас разрывы в отдельных словах
Копипастил не глядя.
Для того, чтобы вывод был не сплошной строкой надо между аргументами расставлять пробелы, например так:
write(X," ",Y," ",Z)
Ответить с цитированием
  (#5 (permalink)) Старый
StarOver StarOver вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2011
По умолчанию 07.11.2011, 22:15

Попытался сделать так, чтобы выводились и список кандидатов, и рейтинг партий, программа работает, но ошибки ещё остались:
prolog Код:
domains
  name = person(symbol,symbol,symbol)                   /* (Last,First,Second) */
  birthday = b_date(symbol,integer,integer)             /* (Month,Day,Year) */
  mesto_rozhdeniya = symbol                             /* (City) */
  mesto_prozhivaniya = symbol                           /* (City) */
  spetsialnost = symbol                                 /* (Education) */
  professiya = symbol                                   /* (Profession) */
  mesto_raboty = symbol                                 /* (Work) */
  izbiratelny_okrug = symbol                            /* (Wote) */
  reyting = string                                      /* (Rate) */
  prinadlezhnost_partii = symbol                        /* (Party) */
 
predicates
  nondeterm person_list(name,birthday,mesto_rozhdeniya,mesto_prozhivaniya,spetsialnost,professiya,mesto_raboty,izbiratelny_okrug,reyting,prinadlezhnost_partii)
  nondeterm get_person_list()
  kandidati_odnoi_partii(prinadlezhnost_partii).
  diagramma(reyting).
 
clauses
  get_person_list:-
        person_list(Name,Birthday,Mesto_rozhdeniya,Mesto_prozhivaniya,Spetsialnost,Professiya,Mesto_raboty,Izbiratelny_okrug,Reyting,Prinadlezhnost_partii),
        fail.
  get_person_list.
 
  kandidati_odnoi_partii(Prinadlezhnost_partii):-person_list(Name,_,_,_,_,_,_,_,_,Prinadlezhnost_partii),
        write(Name," ",Prinadlezhnost_partii,"\n"),fail.
  kandidati_odnoi_partii(_).
 
  diagramma(Reyting):-person_list(_,_,_,_,_,_,_,_,Reyting,Prinadlezhnost_partii),
        write(Reyting," ",Prinadlezhnost_partii,"\n"),fail.
  diagramma(_).
 
  person_list(person(putin,vladimir,vladimirovich),b_date(jan,3,1955),leningrad,moskva,yurist,prime_minister,pravitelstvo,peterburg,"0.55",edinaya_rossiya).
  person_list(person(zyuganov,gennadiy,andreevich),b_date(mar,3,1935),orel,moskva,uchitel,deputat,gosduma,moskva,"0.25",kprf).
  person_list(person(zhirinovskiy,vladimir,volfovich),b_date(apr,29,1951),almaata,moskva,yurist,deputat,gosduma,moskva,"0.15",ldpr).
  person_list(person(mironov,sergey,mikhaylovich),b_date(jan,3,1955),leningrad,moskva,inzhener,deputat,gosduma,peterburg,"0.05",spravedlivaya_rossiya).
 
 
goal
  get_person_list,
  kandidati_odnoi_partii(_),
  diagramma(_).
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 07.11.2011, 22:50

Прелесть какая
Visual Prolog Код:
domains
  name = person(symbol,symbol,symbol)                   /* (Last,First,Second) */
  birthday = b_date(symbol,integer,integer)             /* (Month,Day,Year) */
  mesto_rozhdeniya = symbol                             /* (City) */
  mesto_prozhivaniya = symbol                           /* (City) */
  spetsialnost = symbol                                 /* (Education) */
  professiya = symbol                                   /* (Profession) */
  mesto_raboty = symbol                                 /* (Work) */
  izbiratelny_okrug = symbol                            /* (Wote) */
  reyting = string                                      /* (Rate) */
  prinadlezhnost_partii = symbol                        /* (Party) */
 
predicates
  nondeterm person_list(name,birthday,mesto_rozhdeniya,mesto_prozhivaniya,spetsialnost,professiya,mesto_raboty,izbiratelny_okrug,reyting,prinadlezhnost_partii)
  nondeterm get_person_list()
  kandidati_odnoi_partii().
  diagramma().
 
clauses
  get_person_list:-
        person_list(Name,Birthday,Mesto_rozhdeniya,Mesto_prozhivaniya,Spetsialnost,Professiya,Mesto_raboty,Izbiratelny_okrug,Reyting,Prinadlezhnost_partii),
        Name = person(A,B,C), Birthday = b_date(D,E,F),
        writef("%-15\t%\t%-15\t%\t%\t%\t%\t%\t%\t%-15\t%-12\t%\t%\t%\n",A,B,C,D,E,F,Mesto_rozhdeniya,Mesto_prozhivaniya,Spetsialnost,Professiya,Mesto_raboty,Izbiratelny_okrug,Reyting,Prinadlezhnost_partii),
        fail.
  get_person_list.
 
  kandidati_odnoi_partii():- person_list(Name,_,_,_,_,_,_,_,_,Prinadlezhnost_partii),
        Name = person(A,B,C),
        writef("%-15\t%\t%-15\t%\n",A,B,C,Prinadlezhnost_partii),
        fail;
        true.
 
  diagramma():- person_list(_,_,_,_,_,_,_,_,Reyting,Prinadlezhnost_partii),
        write(Reyting,"\t",Prinadlezhnost_partii,"\n"),
        fail;
        true.
 
  person_list(person(putin,vladimir,vladimirovich),b_date(jan,3,1955),leningrad,moskva,yurist,prime_minister,pravitelstvo,peterburg,"0.55",edinaya_rossiya).
  person_list(person(zyuganov,gennadiy,andreevich),b_date(mar,3,1935),orel,moskva,uchitel,deputat,gosduma,moskva,"0.25",kprf).
  person_list(person(zhirinovskiy,vladimir,volfovich),b_date(apr,29,1951),almaata,moskva,yurist,deputat,gosduma,moskva,"0.15",ldpr).
  person_list(person(mironov,sergey,mikhaylovich),b_date(jan,3,1955),leningrad,moskva,inzhener,deputat,gosduma,peterburg,"0.05",spravedlivaya_rossiya).
 
 
goal
  get_person_list, nl,
  kandidati_odnoi_partii(), nl,
  diagramma().
Ошибок нет, выводится красиво
Ответить с цитированием
Пользователь сказал cпасибо:
StarOver (08.11.2011)
  (#7 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 07.11.2011, 23:04

Щас Автур с этим кодом пойдёт дальше Грымзика на кибере мучать)))
Ответить с цитированием
  (#8 (permalink)) Старый
StarOver StarOver вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2011
По умолчанию 08.11.2011, 14:41

Alison, спасибо за помощь!
Ответить с цитированием
  (#9 (permalink)) Старый
StarOver StarOver вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2011
По умолчанию 08.11.2011, 15:11

И ещё одна просьба!(sorry, если я кого-либо этим "мучаю")
Цитата:
Игроки в некотором теннисном клубе разбиты на три лиги, и могут вызывать на состязание только членов своей лиги или находящихся лигой ниже (если таковая имеется). Напишите программу, которая будет определять все возможные пары игроков клуба, без повторений.
Вот что у меня получилось:
Visual Prolog Код:
domains
  person = symbol
  league   = integer

predicates
  everybody player(person,league)- nondeterm (o,o), nondeterm (i,i)

clauses
  player(john,1).
  player(jack,1).
  player(mike,2).
  player(mark,2).
  player(peter,3).
  player(paul,3).
 
  everybody:-
  player(person1,league1),
  player(person2,league2),
  fail.
 
goal
  player(Person1,League1),
  player(Person2,League2),
  Person1 <> Person2,
  League1 >= League2.
Понимаю, коряво Но для студента, чья специальность не связана с программированием, занимающегося этим только вторую неделю, наверно, не так уж и плохо
Спасибо заранее!!!
Ответить с цитированием
  (#10 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 08.11.2011, 20:52

Раз условие на выбор игроков сложное, то в VIP 5.2 проще всего использовать дополнительный предикат.
Visual Prolog Код:
domains
  person = symbol
  league   = integer

predicates
  player(person,league)- nondeterm (o,o), nondeterm (i,i)
  check(person,person,league,league)- determ (i,i,i,i)

clauses
  player(john,1).
  player(jack,1).
  player(mike,2).
  player(mark,2).
  player(peter,3).
  player(paul,3).
 
  check(Person1,Person2,League,League):-
    Person1 < Person2,
    !.
  check(Person1,Person2,League1,League2):-
    Person1 <> Person2,
    League1 > League2.
 
goal
  player(Person1,League1),
  player(Person2,League2),
  check(Person1,Person2,League1,League2).
Ответить с цитированием
Пользователь сказал cпасибо:
StarOver (09.11.2011)
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кандидаты в президенты России о московских пробках: Leks100 Юмор 0 17.02.2012 19:02
Где найти тесты для тестирования кандидатов на позицию программиста lexluther Программирование графики 3 15.01.2007 12:22



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