2009-10-06 7 views
1

Qu'est-ce qu'un moyen élégant d'unifier X, Y avec (1,2), (1, -2), (-1,2), (-1, -2), (2,1), (2, - 1), (-2,1), (-2, -1)?Qu'est-ce qu'un moyen élégant d'unifier X, Y avec (1,2), (1, -2), (-1,2), (-1, -2), (2,1), (2, -1), (-2,1), (-2, -1)?

En procédant ainsi, semble sujette aux erreurs et fastidieux:

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

Et cette façon semble trop cher:

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

Cela peut nécessiter quelques précisions. : P – Noldorin

+2

Je vois un octogone! Fuir! –

+0

Exemple ajouté ^^^ – TheOne

Répondre

1

Un autre développement sur ce qui a été commenté:

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 ... regarde, c'est plus facile et plus court d'écrire juste tous les cas xD

+0

Je pense vraiment que les réponses de l'autre sont plus claires ... peut-être que vous devriez en accepter une (à moins que vous ne cherchiez une solution à des cas plus gros et plus généraux qui ne peuvent pas être traités de cette façon). – fortran

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

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

Je vais upvote si vous mettez le; sur une ligne de son propre. – starblue

Questions connexes