2016-12-25 2 views
-1

У меня есть координаты 5 точек, и я хочу написать программу, которая отображает все треугольники, которые могут быть сделаны с ними. , например:Создание треугольника с точками - пролог

  • p1 (2,1)
  • P2 (4,2)
  • p3 (4,1)
  • p4 (5,1)
  • р5 (6,3)

и выход должен быть чем-то вроде этого:

  • p1, p2, p3
  • p3, p4, p5
  • ...
+0

Пройдите [тур] (http://stackoverflow.com/tour). –

+0

что я сделал не так? –

+0

@hessamsalehi * «Что я сделал не так?» * Вы не отправили ни одного кода и не просили ни слова. –

ответ

0

Так, по наивности, единственный способ три точки не создают треугольник, если они находятся в прямой линии. В вашем случае это будет, когда они будут иметь одни и те же значения X или Y. Итак, давайте возьмем три очка и посмотрим, по крайней мере, два из них отличаются друг от друга; если это так, это должен быть треугольник.

Вы усложняете вопросы, потому что ваша база данных фактов плохо структурирована. На самом деле, я не собираюсь использовать его на всех, я собираюсь сделать свой собственный вдохновился им:

point(p1, 2,1). 
point(p2, 4,2). 
point(p3, 4,1). 
point(p4, 5,1). 
point(p5, 6,3). 

Теперь давайте предикат:

triangle(P1, P2, P3) :- 
    point(P1, X1, Y1), point(P2, X2, Y2), point(P3, X3, Y3), 

    % first, make sure we have three different points 
    dif(P1, P2), dif(P2, P3), dif(P1, P3), 

    % now, ensure that all three of the Ys and all three of the Xs are not equal 
    \+ (X1 == X2, X2 == X3, X1 == X3), 
    \+ (Y1 == Y2, Y2 == Y3, Y1 == Y3). 

Вы должны быть в состоянии использовать этот предикат для вывода всех допустимых точек. На самом деле вы получите несколько дубликатов, если не добавить ограничение порядка. Но это должно привести вас к правильному пути.