Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_bilety.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.3 Mб
Скачать

Вопрос 12. Элементы математической логики в программировании. Основные формулы математической логики. Стратегии вычисления кванторных формул.

В языке программирования C++ с математической логикой связан тип bool.

Упрощение булевских выражений. Приведем некоторые полезные формулы упрощения логических выражений.

Логическое выражение - выражение, принимающее булевское значение (TRUE или FALSE).

Пусть a, b - логические выражения. Тогда выполняется

• !(! b) = b;

  • ! (a && b) = (! a)ll(! b);

  • ! (a || b) = (! a)&&(! b);

Стратегии вычисления кванторов

Язык математической логики содержит кванторные операции V - квантор всеобщности, 3 - квантор существования.

Пусть переменная x принимает значения из множества X. Пусть B (x) логиче­ское выражение, зависящее от переменной x. Определим логические выражения, которые назовем "А"- формула и "E"- формула и приведем стратегии вычисления данных формул.

"A"- формула: Vx B(x) - для всех x выполняется свойство B(x)

Пусть x Е X = {x1,... , xn}, тогда

VxB (x) B (x1)&& B(x2)kk ... &&B (xn) Можно задать рекуррентное определение квантора:

b0 = true;

bi+1 = bi && B (xi+1)

Это определение дает следующую стратегию вычисления "А'- свойства.

b=true; предполагаем, что свойство B(x)

выполняется для всех x

x = первое x

while (не перебрали все x && b) все еще выполняется свойство B (x)

{ if (! B(x)) then b =FALSE; если для очередного x

свойство B(x) не выполняется, значит наше предположение не верно,

else x = следующий x;

}

cout< < b;

заменяем b на FALSE и

выходим из цикла, ответ уже получен, дальше

ничего проверять не надо,

иначе идем проверять следующий x.

Значение b - ответ.

'E"- формула: 3x B(x) - существует x, для которого выполняется свойство B(x)

Пусть x е X = {x1,... , xn}, тогда

3x B (x)  B(x1) || B(x2) || ... ||B(xn)

Можно задать рекуррентное определение квантора:

b0 = false;

bi+1 = bi || B (xi+1)

Это определение дает следующую стратегию вычисления "E"- свойства.

b=false; предполагаем, что не существует x,

для которого выполняется свойство B(x)

x = первое x

while (не перебрали все x && ! b) все еще не нашлось x, для которого

выполняется свойство B (x)

{ if (! B(x)) then b =TRUE;

else x = следующий x;

}

cout< < b;

если для очередного x свойство B(x) выполняется, значит такой x существует, заменяем b на TRUE и выходим из цикла, ответ уже получен, дальше ничего проверять не надо, иначе идем проверять следующий x. Значение b - ответ.

  • Проверить упорядоченность массива x = (x0,... , xn-1) в порядке неубывания. Задача может быть сформулирована как проверка V-свойства следующим об­разом:

(Vi e{0,...N 2} : x[i] < x[i + 1]);

  • Поиск заданного элемента у в массиве x = (x0,... , xn-1). Задача может быть сформулирована как проверка 3-свойства следующим образом:

(3i е{0,...N 1} : x[i] == у);

  • Проверить равенство двух массивов x = (x0,... ,xN-1) и у = (у0,... ,yN-1). Задача может быть сформулирована как проверка V-свойства следующим об­разом:

(Vi e{0,...N 1} : x[i] == y[i]);

Свойство B (x), которое проверяется для каждого элемента при вычислении 3- и V-свойств, в свою очередь могут быть сложными свойствами. В частности, это опять может быть 3- и V-свойство. В этом случае при проверке свойства для очередного элемента также используем рассмотренную выше стратегию.

Примеры задач на вычисление вложенных 3 и V свойств:

  • Проверить, входит ли массив у = (у0,... ,yMв массив x = (x0,... ,xN как сплошной фрагмент (M < N). Задача может быть сформулирована сле­дующим образом:

(3i e{0,N M} :(vj e{0,...,M 1} : y[j] == x[i + j));

  • Проверка периодичности числового массива x = (x0,... , xn-1). Задача может быть сформулирована следующим образом:

(3r е {l,...n/2} :(vi e{0,...,N r 1} : x[i] == x[i + r)).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]