Допустим, у нас есть функция, которая принимает в качестве входных данных набор логических переменных: bol1, bol2 ... boln. Как мы можем перебрать все возможные логические назначения, используя минимальные коды? Мне нужно реализовать функцию, которая принимает на вход набор из двух логических переменных вместе с логическим выражением, включающим переменные, и создает таблицу истинности. Если вы посмотрите на мой код, это долго. ТАК, я хочу уменьшить это. Кроме того, способ, которым я это сделал, кажется избыточным, так как компилятор выдает предупреждение о том, что регистр совпадений | Var v2 не используется для всех регистров совпадений | Var v2 в коде.
Это упражнения 46/47 в this link : "Определить функцию table2, которая возвращает таблицу истинности данного логического выражения в двух переменных (указанных в качестве аргументов). Возвращаемое значение должно быть список троек, содержащих (value_of_a, balue_of_b, value_of_expr). "
type bool_expr =
| Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr
let table2 (v1 : string) (v2 : string ) (exp : bool_expr)=
let rec evaluate (bol1 : bool) (bol2 : bool) (expp : bool_expr) =
match bol1, bol2 with
|true, true -> (match expp with
|Var v1 -> true
|Var v2 -> true
|Not q -> not (evaluate bol1 bol2 q )
|And (q,w) -> (evaluate bol1 bol2 q) && (evaluate bol1 bol2 w)
|Or (q, w) -> (evaluate bol1 bol2 q) || (evaluate bol1 bol2 w))
|true, false -> (match expp with
|Var v1 -> true
|Var v2 -> false
|Not q -> not (evaluate bol1 bol2 q )
|And (q,w) -> (evaluate bol1 bol2 q) && (evaluate bol1 bol2 w)
|Or (q, w) -> (evaluate bol1 bol2 q) || (evaluate bol1 bol2 w))
|false, true -> (match expp with
|Var v1 -> false
|Var v2 -> true
|Not q -> not (evaluate bol1 bol2 q )
|And (q,w) -> (evaluate bol1 bol2 q) && (evaluate bol1 bol2 w)
|Or (q, w) -> (evaluate bol1 bol2 q) || (evaluate bol1 bol2 w))
|false, false -> (match expp with
|Var v1 -> false
|Var v2 -> false
|Not q -> not (evaluate bol1 bol2 q )
|And (q,w) -> (evaluate bol1 bol2 q) && (evaluate bol1 bol2 w)
|Or (q, w) -> (evaluate bol1 bol2 q) || (evaluate bol1 bol2 w))
in [(true,true, (evaluate true true exp));(true,false, (evaluate true false exp));(false,true, (evaluate false true exp));(false,false, (evaluate false false exp))]
Вот пример ожидаемого результата:
table2 "a" "b" (And (Var "a", Or (Var "a", Var "b"))) ;;
- : (bool * bool * bool) list =
[(правда, правда, правда); (правда, ложь, правда); (ложь, правда, ложь);
(ложь, ложь, ложь)]