Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Образовать прямоугольники
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Julli Julli вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.12.2007
По умолчанию 09.12.2007, 14:41

Есть такая задача. Заданы вещественные числа: 1.6, 2.2, 2.56, 3.7, 4, 4.4, 5.5, 7.25, 8, 9.9, 11, 12.8, 14.5, 18.5, 18.7, 23.2, 24.55, 25.6, 33.66, 46.25, 49.1, 55, 72.5, 84.15, 122.75. Выбирая любые пары этих чисел в качестве высоты и основания, можно образовать множество прямоугольников.
Доказать, что можно таким образом получить 4 прямоугольника с одинаковой площадью (допустимо ограничиться точностью до 0.001). Установить размеры этих прямоугольников. Ограничиться первым решением.
Вот код, но при запуске Пролог зависает. Помогите найти ошибку, пожалуйста!
Код:
domains
    ilist = real*
predicates
    sides (ilist)
    is_el (real, ilist)
    pick_side (ilist, ilist, real)
    
clauses
    sides ([1.6,2.2,2.56,3.7,4,4.4,5.5,7.25,8,9.9,11,12.8,14.5,18.5,18.7,23.2,24.55,25.6,3
3.66,46.25,49.1,55,72.5,84.15,122.75]).

    is_el (H, [H|_]).
    is_el (X, [_|T]) :- is_el (X, T).
    
    % (список возможных, список запрешенных, сторона-результат)
    pick_side ([H|_], LOff, Side) :-
        not (is_el (H, LOff)),
        Side = H.
    pick_side ([_|T], LOff, Side) :-
        pick_side (T, LOff, Side).

goal
    sides (Sides),

    pick_side (Sides, [], X1),
    pick_side (Sides, [X1], X2),
    pick_side (Sides, [X1,X2], Y1),
    pick_side (Sides, [X1,X2,Y1], Y2),
    pick_side (Sides, [X1,X2,Y1,Y2], X3),
    pick_side (Sides, [X1,X2,Y1,Y2,X3], Y3),
    pick_side (Sides, [X1,X2,Y1,Y2,X3,Y3], X4),
    pick_side (Sides, [X1,X2,Y1,Y2,X3,Y3,X4], Y4),
    
    S1 = X1*Y1, 
    S2 = X2*Y2,
    S3 = X3*X3,
    S4 = X4*X4,    
    abs(S1 - S2)<0.1,
    abs(S1 - S3)<0.1,
    abs(S1 - S4)<0.1,
    write ("Rectangle 1:  ",X1," x ",Y1),nl,
    write ("Rectangle 2:  ",X2," x ",Y2),nl,
    write ("their square are: \n",S1," \n",S2," \n",S3).
Ответить с цитированием
  (#2 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 09.12.2007, 19:45

Опять у Вас симпатичная задача. Перебор слишком большой, поэтому и зависает.
Проще выделять подмножества, тогда все находится мгновенно:
Код:
domains
rlist = real*
predicates
sides(rlist)
nondeterm subset(integer,rlist,rlist,rlist)
determ solve
clauses
sides([1.6,2.2,2.56,3.7,4.0,4.4,5.5,7.25,8.0,9.9,11.0,12.8,14.5,18.5,18.7,23.2,24.55,25.6,
33.66,46.25,49.1,55.0,72.5,84.15,122.75]).

subset(0,L,[],L):- !.
subset(N,[A|L],[A|S],R):- N1 = N-1, subset(N1,L,S,R).
subset(N,[A|L],S,[A|R]):- subset(N,L,S,R).

solve:-
    sides (Sides),
    subset(2,Sides,[X1,Y1],Sides1),
    subset(2,Sides1,[X2,Y2],Sides2),
    S1 = X1*Y1,
    S2 = X2*Y2,
    abs(S1 - S2) < 0.001,
    subset(2,Sides2,[X3,Y3],Sides3),
    S3 = X3*Y3,
    abs(S1 - S3) < 0.001,
    abs(S2 - S3) < 0.001,
    subset(2,Sides3,[X4,Y4],_),
    S4 = X4*Y4,
    abs(S1 - S4) < 0.001,
    abs(S2 - S4) < 0.001,
    abs(S3 - S4) < 0.001,
    !,
    writef("Rectangle 1: % x %\n",X1,Y1),
    writef("Rectangle 2: % x %\n",X2,Y2),
    writef("Rectangle 3: % x %\n",X3,Y3),
    writef("Rectangle 4: % x %\n",X4,Y4),
    writef("Their square are:\n%\n%\n%\n%\n",S1,S2,S3,S4).
goal
solve.
Вот ответ:
Код:
Rectangle 1: 2.56 x 72.5
Rectangle 2: 7.25 x 25.6
Rectangle 3: 8 x 23.2
Rectangle 4: 12.8 x 14.5
Their square are:
185.6
185.6
185.6
185.6
yes
Ответить с цитированием
  (#3 (permalink)) Старый
Julli Julli вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.12.2007
По умолчанию 09.12.2007, 22:11

Преогромное спасибо! Даже не знаю, чтоб я без Вас делала! Просто трудно совмещать работу и учебу. А вы моя палочка-выручалочка!
Ответить с цитированием
  (#4 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 09.12.2007, 22:14

Видимо, придется это дело прекратить.
Повезло Вам, что преподаватель симпатичные задачки дает.
Ответить с цитированием
  (#5 (permalink)) Старый
webmenn webmenn вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.12.2007
По умолчанию 22.12.2007, 20:17

Обьясните пожалуйста, что такое subset.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
webmenn webmenn вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.12.2007
По умолчанию 22.12.2007, 20:17

Обьясните пожалуйста, что такое subset.
Ответить с цитированием
  (#7 (permalink)) Старый
webmenn webmenn вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.12.2007
По умолчанию 22.12.2007, 20:17

Обьясните пожалуйста, что такое subset.
Ответить с цитированием
  (#8 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.12.2007, 22:01

Предикат subset
Код:
subset(N,List,SubSet,Rest)
возвращает для множества, представленного списком List, подмножество SubSet, состоящее из N элементов, и список оставшихся элементов Rest.
Поиск недетерминированный. Последовательно находятся все подмножества, состоящие из заданного числа элементов, и оставшиеся части множества.
Ответить с цитированием
Ads
  (#9 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.12.2007, 22:01

Предикат subset
Код:
subset(N,List,SubSet,Rest)
возвращает для множества, представленного списком List, подмножество SubSet, состоящее из N элементов, и список оставшихся элементов Rest.
Поиск недетерминированный. Последовательно находятся все подмножества, состоящие из заданного числа элементов, и оставшиеся части множества.
Ответить с цитированием
  (#10 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.12.2007, 22:01

Предикат subset
Код:
subset(N,List,SubSet,Rest)
возвращает для множества, представленного списком List, подмножество SubSet, состоящее из N элементов, и список оставшихся элементов Rest.
Поиск недетерминированный. Последовательно находятся все подмножества, состоящие из заданного числа элементов, и оставшиеся части множества.
Ответить с цитированием
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прямоугольники на плоскости overcoder Алгоритмы 2 11.01.2011 22:04
Как сделать прозрачные прямоугольники на картинке toshkaexe C++ Builder 2 03.09.2007 23:41
В играх с DirectX компьютер подвисает, в текстуре картинки появляются прямоугольники. lasama Техническая поддержка 5 03.06.2007 20:18
Как соединить прямоугольники psyb00t Алгоритмы 6 01.10.2004 10:46
Образовать массив В из чисел массива А, делящихся без остатка на 2 Belldandy Assembler 3 16.06.2003 10:38



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