Pull to refresh

Comments 6

на прологе

cartesian([S | SS], [H | T]) :-
  member(H, S),
  ( SS = []
  -> T = []
  ; cartesian(SS, T)
  ).


тест:
?- cartesian([[a,b],[x,y,z],[p,q]],R).
R = [a, x, p] ;
R = [a, x, q] ;
R = [a, y, p] ;
R = [a, y, q] ;
R = [a, z, p] ;
R = [a, z, q] ;
R = [b, x, p] ;
R = [b, x, q] ;
R = [b, y, p] ;
R = [b, y, q] ;
R = [b, z, p] ;
R = [b, z, q].

или:

?- findall(R,cartesian([[a,b],[x,y,z],[p,q]],R),L).
L = [[a, x, p], [a, x, q], [a, y, p], [a, y, q], [a, z, p], [a, z, q], ...
Никаких возражений. Рекурсивные определения естественно и красиво ведут к Прологу, да.
на С#:
var S1 = new[] {'a''b'};
var S2 = new[] {'x''y''z'};
var S3 = new[] {'p''q''r''s''t'};
var sequences = new[] { S1, S2, S3 };
var product = sequences.CartesianProduct(); // реализован как метод расширения
Спасибо, только что применил для вывода дистрибьютивности в логических выражениях.
Отмечу, что в оригинальном посте появилась ссылка на мысли другого разработчика на то же вычисление:
http://www.interact-sw.co.uk/iangblog/2010/07/28/
Там же доступны версии для других языков (Haskell, Closure) и ранних версий .NET:
http://www.interact-sw.co.uk/iangblog/2010/08/05/linq-cartesian-5
Sign up to leave a comment.

Articles