Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Предикаты сбора 
:(
    Опции темы
Garret
Дата 24.6.2007, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть такая проблема. У нас есть координаты точек, нужно вывести все возможные квадраты которые могут получится. Вот код:
Код

point(a,1,1).
point(b,1,5).
point(c,5,1).
point(d,5,5).
point(e,1,3).

main(L):-
    findall(A-B-C-D,is_rect(A,B,C,D),L).

is_rect(A,B,C,D):-
    point(A,X1,Y1),
    point(B,X2,Y2),
    point(C,X3,Y3),    
    point(D,X4,Y4),
    A\=B,
    B\=C,
    C\=D,
    A\=C,
    A\=D,
    B\=D,
    St1 is sqrt(((X1-X2)*(X1-X2))+((Y1-Y2)*(Y1-Y2))),
    St2 is sqrt(((X1-X4)*(X1-X4))+((Y1-Y4)*(Y1-Y4))),
    St3 is sqrt(((X3-X2)*(X3-X2))+((Y3-Y2)*(Y3-Y2))),
    St4 is sqrt(((X3-X4)*(X3-X4))+((Y3-Y4)*(Y3-Y4))),
    Diag is sqrt(((X1-X3)*(X1-X3))+((Y1-Y3)*(Y1-Y3))),
    Diag2 is sqrt(((X2-X4)*(X2-X4))+((Y2-Y4)*(Y2-Y4))),
    abs(St1-St2)<0.0001,
    abs(St2-St3)<0.0001,
    abs(St3-St4)<0.0001,
    abs(Diag-Diag2)<0.0001.



Все нормально работает, только выводятся все возможныеварианты расстановки точек:
L = [a-b-d-c, a-c-d-b, b-a-c-d, b-d-c-a, c-a-b-d, c-d-b-a, d-b-a-c, d-c-a-b] 

Хотя это 1 квадрат, есть ли какая то функция которая позволит убрать дубликаты?
PM MAIL WWW ICQ   Вверх
cherep
Дата 25.6.2007, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Могу предложить такой код:

Код

the_same(A-B-C-D, E-F-G-H) :-
 sort([A, B, C, D], Res),
 sort([E, F, G, H], Res).

has(Squares, Sq) :-
 member(S, Squares),
 the_same(S, Sq).
 
wo_dublicates([], []).
wo_dublicates([H | T], Res) :-
 (has(T, H)
 ->
 wo_dublicates(T, Res)
 ;
 Res = [H | L],
 wo_dublicates(T, L)).


На Вашем примере:
Код

24 ?- L = [a-b-d-c, a-c-d-b, b-a-c-d, b-d-c-a, c-a-b-d, c-d-b-a, d-b-a-c, d-c-a-b], wo_dublicates(L, R).

L = [a-b-d-c, a-c-d-b, b-a-c-d, b-d-c-a, c-a-b-d, c-d-b-a, ... -... -a-c, ... -... -b],
R = [d-c-a-b] ;

No

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

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

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


 




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


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

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