2009-10-06 6 views
1

X, Y를 (1,2), (1, -2), (-1,2), (-1, -2), (2,1), (2, - 1), (-2,1), (-2, -1)? 이런 식으로 이렇게X, Y를 (1,2), (1, -2), (-1,2), (-1, -2), (2,1), (2, -1)로 통합하는 우아한 방법은 무엇입니까?), (-2,1), (-2, -1)?

보이는 경향이 지루한 오류 :

foo(1,2). 
foo(1,-2). 
foo(-1,-2). 
... 
... 
... 

그리고이 방법은 너무 비싸 보인다

foo(X,Y) :- 
    L = [1,-1,2,-2], 
    member(X,L), 
    member(Y,L), 
    abs(X,X1), abs(Y,Y1), 
    X1 =\= Y1. 
+2

여기에는 약간의 설명이 필요할 수 있습니다. : P – Noldorin

+2

나는 팔각형을 본다! 서두르다! –

+0

추가 된 예 ^^^ – TheOne

답변

1

주석이 있었는지에 대한 추가 개발 :

generate_pairs_foo(X,Y) :- 
    L = [1,-1,2,-2], 
    member(X,L), 
    member(Y,L), 
    abs(X,X1), abs(Y,Y1), 
    X1 =\= Y1. 

assert_all_foo([]). 

assert_all_foo([(X,Y)|T]) :- 
    assert(foo(X,Y)), assert_all_foo(T). 

find_all((X,Y),generate_pairs_foo(X,Y),L), assert_all_foo(L). 

Hmmmmmm ...보기, 모든 케이스를 작성하는 것이 더 쉽고 짧습니다. xD

+0

다른 사람들의 대답이 더 명확하다고 생각합니다 ... 아마도 당신은 그 중 하나를 받아 들여야합니다. (그런 식으로 처리 할 수없는 더 크고 일반적인 경우에 대한 해결책을 찾고있는 것이 아니라면). – fortran

3
foo0(X,Y):- 
    member(X,[1,-1]), 
    member(Y,[2,-2]). 

foo(X,Y):- 
    foo0(X,Y); 
    foo0(Y,X). 
+1

내가 넣으면 upvote거야; 그 자신의 라인에. – starblue