Как создать контрольные примеры, основанные на значениях таблицы истинности? - PullRequest
0 голосов
/ 18 октября 2019

Я создаю вывод из токенов из spaCy из документации. Используя таблицу истинности, мне нужно вывести все возможные сценарии для тестирования. Количество входов может варьироваться от входа к входу. Если возможно, я бы хотел, чтобы это было гибким, чтобы сделать 3+ ввода таким образом: ((a и b) или c).

Каждый сценарий имеет положительный (True) или отрицательный (False) аспектна его вход (т.е. когда вход установлен как ИЛИ, если вход не установлен), потому что все возможные случаи должны быть проверены. Для сценария с двумя входами целью является следующий результат:

Вход: если «Вход 1 установлен» или «Вход 2 недоступен», то «Обнаружен сбой».

Выход:

  1. Случай 1:

    • Вход 1 установлен
    • Вход 2 недоступен
    • Обнаружена ошибка
  2. Случай 2:

    • Вход 1 не установлен
    • Вход 2 недоступен
    • ОшибкаОбнаружено
  3. Случай 3:

    • Вход 1 установлен
    • Вход 2 доступен
    • ОшибкаОбнаружен
  4. Случай 4:

    • Вход 1 не установлен
    • Доступен вход 2
    • ОшибкаНе обнаружено

Для 3 или более входов оно будет экспоненциально увеличено.

У меня нет проблем с форматированием / извлечением строковых значений из массива или списка в правильный формат для моего вывода. Моя главная проблема - итерация по n входам и смешанным типам логики.

def truth_table(n):
    table = list(itertools.product([False, True], repeat=n))
    print(table)
truth_table(3)

Это не работает для меня, поскольку касается только входов, а не результирующих выходов.

Я рассмотрел добавление входных данных в виде кортежей, присвоение значения 1 или 0 в качестве индикатора положительной или отрицательной «версии» и определение моей таблицы истинности в виде 2D-списка. Затем выполните итерацию по каждой позиции таблицы истинности и создайте новый двумерный массив с указанными операторами ввода, заменяющими значения 0 и 1.

or_2 = [[0,0,0],
        [0,1,1],
        [1,0,1],
        [1,1,1]]

and_2 = [[0,0,0],
        [0,1,0],
        [1,0,0],
        [1,1,1]]

1 Ответ

0 голосов
/ 19 октября 2019

Ваш набор значений (не набор выходных данных) для каждого фактора является перечислением возможных значений. Похоже, что ваш ввод довольно каноничен в этом отношении, так как набор состоит из слова состояния с / без слова «не» перед ним. Таким образом, у вас есть наборы

A     {"not set", "set"}
B     {"not available", "available"}
out   {"not Detected", "Detected"}

Вы различаете вход и выход по разделителю «затем». У вас есть 4 варианта использования, потому что AxB имеет 4 элемента.

Вы можете ссылаться на эти наборы в виде списка или указания, если это соответствует вашему использованию. Я не уверен, что вы подразумеваете под «х-типом логики»;если вы анализируете логическое выражение, то вам нужно искать именно этот тип синтаксического анализатора.

В данном случае вам нужно извлечь информацию для каждого предложения и воплотить ее в положительное поколение для вашегоТретий столбец "Out". Ниже обратите внимание, что я предполагаю, что ваше ключевое слово "then" логически "iff".

state_1 = "set"
state_2 = "not available"
op_1 = operator.__or__

table = []
for in1, in2 in itertools.product(A, B):
    val1 = in1 == state_1
    val2 = in2 == state_2
    table.append([val1, val2, op_1(val1, val2)])

Вывод (значение таблицы):

[[False, True, True],
 [False, False, False],
 [True, True, True],
 [True, False, True]]

С большим количеством входных данных и большим количеством логических операций,вам нужно будет обратиться к механизмам синтаксического анализа и построить дерево этих бинарных операций.

Это заставляет вас двигаться?

...