Как создать список, которого еще нет?

У меня есть список списков, я хотел бы создать новый список, которого нет в старых списках, как я могу сделать это автоматически?

DB : list of list of uint;
generate_new_data() is {
    for i from 1 to 10 {
        var new_list : list of uint;

        gen new_list keeping {
           it.size() == n;
           it not in DB;
        };

        DB.add( new_list );
    };
};

Новый список может быть перестановкой старого, мне нужны разные значения в элементах списка, он может быть одним или всеми разными (я хочу, чтобы это было случайным)


person Kamil.Khoury    schedule 23.02.2016    source источник
comment
Привет, аналогичный вопрос был задан здесь: all-other-value/34763920#34763920" title="specman ошибка при создании списка списков со всеми разными значениями"> stackoverflow.com/questions/34741160/ пожалуйста, взгляните и посмотрите, есть ли это это то, что вы имели в виду.   -  person yuvalg    schedule 24.02.2016
comment
Это не помогает, я хочу создать новый список, который раньше не создавал. пример: список №1 - {1, 2, 3}, список №2 - {1, 2, 4}...   -  person Kamil.Khoury    schedule 24.02.2016


Ответы (1)


Рассмотрим следующее: если два списка не равны, то существует по крайней мере одно место, где значения различаются. Поэтому,

l1 is different than l2  if and only if there exists a 'diff_at' such that l1[diff_at]!=l2[diff_at]

Используя этот подход, вся БД может быть сгенерирована в одной CFS:

struct db_wrapper_s {
    DB : list of list of uint;
    diff_at : list of list of uint;

    keep DB.size() == diff_at.size();

    keep for each in diff_at {
        it.size() == index;
        for each in it {
            it < read_only(DB[index].size());
        };
    };

    keep for each (diff_i) using index (i) in diff_at {
        for each (diff_i_j) using index (j) in diff_i {
            DB[i][diff_i_j] != DB[j][diff_i_j];
        };
    };
};

generate_new_data() is {
    var genDB : db_wrapper_s;
    var db_sz : uint = 10;
    var l_sz : uint = 5;
    gen genDB keeping {
        it.DB.size() == read_only(db_sz);
        for each in it.DB {
            it.size() == read_only(l_sz);
        };
    };
    print genDB.DB;
};

Проблема с вышеизложенным заключается в том, что он, вероятно, будет страдать от длительного времени решения, если количество списков в БД и размер списка велики.

Начиная с Specman 14.2 генератор случайных чисел поддерживает индекс генеративного списка:

keep foo()[gen_var] == ... ;

(Эта функция отключена в 14.2/15.1 и должна быть включена с помощью «config gen -use_generative_list_index=TRUE»).

Используя эту функцию, вы можете построить список БД по списку:

struct new_list_wrapper_s {
    new_list : list of uint;
    diff_at : list of uint;
};

!DB : list of list of uint;
generate_new_data() is {
    var n : uint = 5;
    for i from 1 to 10 {
        var new_list_wrapper : new_list_wrapper_s;
        gen new_list_wrapper keeping {
            it.diff_at.size() == read_only(DB.size());
            it.new_list.size() == read_only(n);
            for each (diff_loc) in it.diff_at {
                diff_loc < read_only(n);
                it.new_list[diff_loc] != read_only(DB[index])[diff_loc];
            };
        };
        DB.add( new_list_wrapper.new_list );
    };
    print DB;
};
person Amit M.    schedule 24.02.2016