2015-10-08 2 views
0

Общий декартово произведение может быть реализован как:Генерация декартово мощности в Standard ML

fun cartesian(xs, ys) = 
    let fun pairOne(x,[]) = [] 
    | pairOne(x, y::ys) = [x,y]::pairOne(x,ys) 
     fun cart([],ys) = [] 
    | cart(x::xs, ys) = pairOne(x, ys) @ cart(xs,ys) 
    in 
     cart(xs,ys) 
    end 

Я ищу способ создания декартово мощности класса к.

Для к = 2, это выведет:

[[true,true],[true,false],[false,true],[false,false]] 

И при к = 3:

[[true,true,true],[true,true,false],[true,false,false],[false,false,false],[false,false,true],...] 

Благодаря

+0

Вы, похоже, не будет просить о перестановках вообще. Более того, как вы спрашиваете о декартовых силах списка с самим собой. –

+0

@JohnColeman Спасибо, ты прав. Я пересмотрел свой вопрос. –

ответ

2

Ниже, кажется, работает:

fun product [] _ = [] 
| product (x::xs) products = (map (fn p => x::p) products) @ product xs products 

fun power _ 0 = [] 
| power xs 1 = map (fn x => [x]) xs 
| power xs n = product xs (power xs (n-1)) 

Первая функция образует декартову р а также список, который уже является списком списков. Например,

- product [1,2] [[3],[4]]; 
val it = [[1,3],[1,4],[2,3],[2,4]] : int list list 

Основное назначение этого метода - вспомогательная функция, которая добавляет еще один фактор к существующему декартовому произведению. Функция power сначала берет список и преобразует его в «мощность» с 1 фактором в базисном случае n = 1, а затем строит мощность с использованием рекурсии A^n = A x A^(n-1).

Например,

- power [true,false] 2; 
val it = [[true,true],[true,false],[false,true],[false,false]] : bool list list 
+0

Отлично, большое спасибо! –