Kosat, алгоритм проверки формулы по таблице истинности представляете? Когда сначала для каждой буквы устанавливается - истинна она или ложна, затем для выражений, образованных из этих букв, затем для выражений из выражений и так далее, пока до формулы не дойдём.
Например, та же
![$A \vee B \to B \vee A$ $A \vee B \to B \vee A$](https://dxdy-04.korotkov.co.uk/f/3/8/7/38784af5ef679ed747ab2c1e9b2e624182.png)
. Начинаем с четырёх стартовых позиций - четырёх строк таблицы истинности. Например, для случая
![$A=0$ $A=0$](https://dxdy-04.korotkov.co.uk/f/3/e/f/3efd8f56b9a4de7cd1da2f06d49c6a5482.png)
,
![$B=1$ $B=1$](https://dxdy-04.korotkov.co.uk/f/3/c/b/3cbf3fc3b065676673b8143bc7c8d22282.png)
. Вычисляем
![$A$ $A$](https://dxdy-02.korotkov.co.uk/f/5/3/d/53d147e7f3fe6e47ee05b88b166bd3f682.png)
:
![$A=0$ $A=0$](https://dxdy-04.korotkov.co.uk/f/3/e/f/3efd8f56b9a4de7cd1da2f06d49c6a5482.png)
. Вычисляем
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
:
![$B=1$ $B=1$](https://dxdy-04.korotkov.co.uk/f/3/c/b/3cbf3fc3b065676673b8143bc7c8d22282.png)
. Затем вычисляем
![$A \vee B = 0 \vee 1 = 1$ $A \vee B = 0 \vee 1 = 1$](https://dxdy-04.korotkov.co.uk/f/3/9/6/396b8da5b983b400b3cb20641913d06982.png)
. Затем вычисляем
![$B \vee A = 1 \vee 0 = 1$ $B \vee A = 1 \vee 0 = 1$](https://dxdy-03.korotkov.co.uk/f/2/2/c/22c5455fac7bbb5a255882d1198d18ef82.png)
. Наконец вычисляем всё выражение
![$A \vee B \to B \vee A = 1 \to 1 = 1$ $A \vee B \to B \vee A = 1 \to 1 = 1$](https://dxdy-04.korotkov.co.uk/f/f/c/f/fcfc5321f0dcdcbbf158c18eacadc96d82.png)
. А откуда мы знаем, что
![$0 \vee 1 = 1$ $0 \vee 1 = 1$](https://dxdy-01.korotkov.co.uk/f/8/f/b/8fb48e3411a163e410f55d53abef901f82.png)
,
![$1 \to 1 = 1$ $1 \to 1 = 1$](https://dxdy-03.korotkov.co.uk/f/a/7/1/a717add09b33860f89838705d0e106e382.png)
и т. д.? А у нас должны быть забиты в программу таблички, в которых все возможные варианты записаны.
Доказательство производится также. Только вместо "рассчитать значение подвыражения
![$X$ $X$](https://dxdy-01.korotkov.co.uk/f/c/b/f/cbfb1b2a33b28eab8a3e59464768e81082.png)
-
![$1$ $1$](https://dxdy-01.korotkov.co.uk/f/0/3/4/034d0a6be0424bffe9a6e7ac9236c0f582.png)
или
![$0$ $0$](https://dxdy-03.korotkov.co.uk/f/2/9/6/29632a9bf827ce0200454dd32fc3be8282.png)
" для каждой подформулы
![$X$ $X$](https://dxdy-01.korotkov.co.uk/f/c/b/f/cbfb1b2a33b28eab8a3e59464768e81082.png)
нужно написать доказательство - либо доказательство
![$X$ $X$](https://dxdy-01.korotkov.co.uk/f/c/b/f/cbfb1b2a33b28eab8a3e59464768e81082.png)
, либо доказательство
![$\neg X$ $\neg X$](https://dxdy-03.korotkov.co.uk/f/2/9/3/2931b9c1ebd826e89c17c2bed77fbfc082.png)
. Например, для случая
![$\neg A$ $\neg A$](https://dxdy-03.korotkov.co.uk/f/a/a/f/aaf777f10cb5cd8a3efff3e18c2662a382.png)
,
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
. Доказываем
![$\neg A$ $\neg A$](https://dxdy-03.korotkov.co.uk/f/a/a/f/aaf777f10cb5cd8a3efff3e18c2662a382.png)
:
![$\neg A$ $\neg A$](https://dxdy-03.korotkov.co.uk/f/a/a/f/aaf777f10cb5cd8a3efff3e18c2662a382.png)
. Доказываем
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
:
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
. Затем доказываем
![$A \vee B$ $A \vee B$](https://dxdy-01.korotkov.co.uk/f/8/0/c/80c75cb45c01e8a430336cde7f02c6bb82.png)
. Как? А у нас должны быть забиты в программу таблички, в которых все возможные варианты записаны. Только теперь это должны быть таблички функций. В предыдущем случае у нас для дизъюнкции была табличка из четырёх строк, так?
Вот такая:
Код:
x | y | x V y
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1
И здесь у нас тоже должна быть такая же табличка их четырёх строк. Но теперь каждая строка - это не тройка чисел, а функция, которая принимает два аргумента. Первый аргумент - это ряд формул, доказательство
![$X$ $X$](https://dxdy-01.korotkov.co.uk/f/c/b/f/cbfb1b2a33b28eab8a3e59464768e81082.png)
либо
![$\neg X$ $\neg X$](https://dxdy-03.korotkov.co.uk/f/2/9/3/2931b9c1ebd826e89c17c2bed77fbfc082.png)
- в зависимости от строки таблицы. Второй аргумент - опять же ряд формул, доказательство
![$Y$ $Y$](https://dxdy-02.korotkov.co.uk/f/9/1/a/91aac9730317276af725abd8cef04ca982.png)
или
![$\neg Y$ $\neg Y$](https://dxdy-02.korotkov.co.uk/f/1/f/7/1f752b00465a1b302cb3c31b33dc4cc382.png)
- опять же в зависимости от строки. А возвращать эти функции должны соответственно доказательство
![$X \vee Y$ $X \vee Y$](https://dxdy-04.korotkov.co.uk/f/f/8/7/f872694b346520518e1429754a11fe9b82.png)
(для функций из нижних трёх строк) или
![$\neg(X \vee Y)$ $\neg(X \vee Y)$](https://dxdy-04.korotkov.co.uk/f/7/0/f/70fea4df6404b10418d398c21644d48a82.png)
(для функции в верхней строке).
Таким образом, мы выбираем подходящую функцию и скармливаем ей доказательство
![$\neg A$ $\neg A$](https://dxdy-03.korotkov.co.uk/f/a/a/f/aaf777f10cb5cd8a3efff3e18c2662a382.png)
(а это, напоминаю, просто список из одной формулы - собственно
![$\neg A$ $\neg A$](https://dxdy-03.korotkov.co.uk/f/a/a/f/aaf777f10cb5cd8a3efff3e18c2662a382.png)
) и доказательство
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
(аналогично, список из одной этой формулы). И получаем на выходе доказательство
![$A \vee B$ $A \vee B$](https://dxdy-01.korotkov.co.uk/f/8/0/c/80c75cb45c01e8a430336cde7f02c6bb82.png)
. Дальше таким же макаром получаем доказательство
![$B \vee A$ $B \vee A$](https://dxdy-01.korotkov.co.uk/f/c/5/1/c517aa2d7fb8a366b08a8fd4eb3b1ff182.png)
. Наконец, берём табличку для импликации, берём фукцию из последней строки, скармливаем ей имеющиеся у нас на этом этапе доказательства
![$A \vee B$ $A \vee B$](https://dxdy-01.korotkov.co.uk/f/8/0/c/80c75cb45c01e8a430336cde7f02c6bb82.png)
и
![$B \vee A$ $B \vee A$](https://dxdy-01.korotkov.co.uk/f/c/5/1/c517aa2d7fb8a366b08a8fd4eb3b1ff182.png)
, и получаем назад искомое доказательство.
Видите - всё очень просто, надо только накодить эти таблички функций. Всего функций будет 14 штук - две для отрицания и по четыре для остальных операций.
Если эта идея понятна, можете начинать писать функцию для первой строки таблицы импликации. Я вам помогу.