/* Подсчёт числа возможных моделей различных расположений n ящиков, * удовлетворящих транзитивному отношению in (древесный порядок). * Соответствует последовательности http://oeis.org/A000272 (n+1)^(n-1) * 1, 3, 16, 125, 1296, 16807, 262144, 4782969, 100000000, 2357947691,.. * * (с) oct-2018, steps qudata.com ***********************************************************************/ edges in // объявляем типы рёбер GRAPH.add_nodes(5) // будет 4 узла (ящика) // Регестрируем аксиомы отношения "X внутри Y" // Mind.add( !(X in X), // антирефлексивно (X in Z) & (Z in Y) -> (X in Y), // транзитивно (Z in X) & (Z in Y) -> (X in Y) | (Y in X) | (X==Y), // дерево ) // Добавить в очередь Open новый граф, установив X in Y в значение Val // def add_graph(Open, X, Y, Val) { var GV = GRAPH.copy() // делаем копию графа GRAPH = GV // делаем её активной X in Y = Val // меняем ребро Mind.set_graph(GV) // запускаем логический вывод Open.push(GV) // добавляем граф в очередь } // Найти первое неопределённое ребро и породить два графа, в одном // из которых положить ребро in в True, а во втором в False // Эти графы помещаются в очередт Open // def set_edges(Open) { for X : // бежим по всем узлам графа if exists(Y, (X in Y) == Undef){ // если есть узел с неопределённым ребром add_graph(Open, X, Y, True) // создаём две копии графа add_graph(Open, X, Y, False) // в которых определяем это ребро return True } return False } var G = GRAPH // для краткости //G[1] in G[2]; // можем задать ограничения Mind.set_graph(G) // устанавливаем антирефлексивность var Open = [ G.copy() ] // помещаем в очередь начальный граф var N_MODELS = 0 // число сгенерённых моделей while !Open.empty() { // пока очередь не пустая GRAPH = Open.pop() // извлекаем из неё граф if !set_edges(Open){ // если не нашли Undef рёбер N_MODELS++ // это финальная модель //out GRAPH // выводим её } } out "Count of graphs: ", N_MODELS // выводим число моделей out System.time(),"ms" // выводим время работы //---------------------------------------- Второй способ решения: GRAPH.clear_edges() // убиваем все рёбра System.time(0) // сбрасываем таймер out "Count of graphs: ", out Mind.count_models(GRAPH, in) // Mind подсчитывает число моделей out System.time(),"ms" // выводим время работы