У меня есть таблицы истинности для разных логических операторов;
truthtable a1
| a1 == "mynot" = [(p,q,r,s) | p <- [0,1], q <- [0,1], let r = mynot p, s <- ["mynot"]]
| a1 == "myand" = [(p,q,r,s) | p <- [0,1], q <- [0,1], let r = myand p q, s <- ["myand"]]
| a1 == "myor" = [(p,q,r,s) | p <- [0,1], q <- [0,1], let r = myor p q, s <- ["myor"]]
| a1 == "myimply" = [(p,q,r,s) | p <- [0,1], q <- [0,1], let r = myimply p q, s <- ["myimply"]]
Теперь я должен создать функцию (equiv
), которая определяет, действуют ли два оператора одинаково, и приводит пример счетчика, если нет.Таким образом, для equiv "myimply" "myimply"
он должен определить, что это эквивалентно, но для equiv "myimply" "myor"
он должен вызвать функцию counterEx
, которая дает контрпример (что операторы не совпадают).
Теперь у меня было это:
equiv a1 a2
| truthtable a1 == truthtable a2 = True
| otherwise = counterEx a1 a2
counterEx a1 a2 = truthtable a1 ++ truthtable a2
Но, конечно, equiv
имеет разные результаты и, следовательно, это невозможно.Однако я действительно не знаю, как я могу привести лучший контрпример (чем просто дать все возможности, и вы просто посмотрите, что не то же самое).Также я не знаю, как я могу вызвать функцию counterEx
, если таблицы истинности не эквивалентны, а только определить, что они одинаковы, если таблицы истинности действительно одинаковы.