Ваша функция combinations
уже создает список списков длины n
, содержащих все возможные перестановки True
и False
. Вам не нужно использовать concat
; результат уже включает все возможные записи в вашу функцию. Дело в том, что функция, которую вы проверяете, уже ожидает список (в форме \[a,b,c...]
).
То есть для fn
, берущего список длины 3, combinations 3
будет:
[[True,True,True],[True,True,False],[True,False,True],[True,False,False],
[False,True,True],[False,True,False],[False,False,True],[False,False,False]]
Каждый элемент этого списка является списком; вы можете напрямую передать их в функцию, которую вы проверяете (та, которая может быть тавтологией). Учитывая приведенный выше список, все, что вам нужно сделать, это попробовать каждый элемент.
РЕДАКТИРОВАТЬ (пытаясь немного уточнить):
Вам нужна функция taut
, которая принимает другую функцию типа [Bool] -> Bool
и определяет, является ли эта функция тавтологией. Это означает, что taut
будет иметь тип, подобный Int -> ([Bool] -> Bool) -> Bool
. Допустим, вы начинаете это так:
taut :: Int -> ([Bool] -> Bool) -> Bool
taut n fn = ...
Теперь n
— это длина, а fn
— это функция. Ваша функция combinations
принимает n
и возвращает все возможные допустимые входные данные в fn
. Обратите внимание, что fn
ожидает [Bool]
, а combinations n
— это [[Bool]]
, что означает, что каждый элемент может быть входом для fn
. Зная это, все, что вам нужно сделать, это применить fn
к каждому элементу combinations n
и посмотреть, всегда ли результат будет одинаковым.
В вашей функции taut
вам не нужно беспокоиться о том, как назначаются переменные внутри тестируемой функции. Когда вы на самом деле пишете эту функцию, если она имеет форму \[x,y,z]->...
, x
, y
и z
, она будет назначена внутри нее благодаря сопоставлению с образцом.
person
Tikhon Jelvis
schedule
11.12.2011