Редактирование: Математическая Логика, 07 семинар (от 19 декабря)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 1: Строка 1:
-
[[Математическая Логика, 06 семинар (от 05 декабря)|Предыдущий семинар]] | Следующий семинар
+
== From Ebaums Inc to MurkLoar. ==
-
 
+
We at EbaumsWorld consider you as disgrace of human race.
-
== Оператор отсечения «!» ===
+
Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated.
-
 
+
Dig yourself a grave - you will need it.
-
Оператор отсечения указывает, какие ветви не должны проходиться при откате при SLD-резолюции. Имеет следующий смысл:
+
-
* A<sub>0</sub> &larr; A<sub>1</sub>, &hellip;, A<sub>k</sub>, !, A<sub>k + 1</sub>, &hellip;, A<sub>n</sub> — проверить A<sub>1</sub>, &hellip;, A<sub>k</sub> и использовать A<sub>k + 1</sub>, &hellip;, A<sub>n</sub>
+
-
 
+
-
Символ «!» обычно обозначает требование единственности, поэтому он и выбран, так как доказательство строится единственным возможным способом.
+
-
 
+
-
[[Image:Exclamation.png|thumb|400px|Как работает предикат отсечения]]
+
-
Пусть у нас выполняются SLD-вычисления, в результате которых в качестве тела одной из подстановок мы имеем список подцелей, содержащих «!». Как только интерпретатор получает запрос в качестве SLD-резольвенты, он ставит у предыдущего запроса «(*», после чего вычисления продолжаются обычным образом, до тех пор, пока «!» не станет самоц левой подцелью. После чего он ставит вторую пометку, «!» убирается из списка подцелей и вычисления продолжаются дальше. Когда делается откат с G<sub>4</sub>, он делается до G<sub>1</sub> и вычисления продолжаются дальше. При этом также не проходятся другие ветви. Это делается для того, чтобы повысить эффективность порграммы. Также это позволяет организовывать программные конструкции.
+
-
S<sub>0</sub>: if P then S<sub>1</sub> else S<sub>2</sub>
+
-
+
-
S<sub>0</sub> &larr; P, !, S<sub>1</sub> |
+
-
S<sub>2</sub>;
+
-
Если P истинно, то задача решается только методом S<sub>1</sub> иначе S<sub>2</sub>.
+
-
 
+
-
S<sub>0</sub>: while P do S<sub>1</sub> od
+
-
+
-
S<sub>0</sub> &larr; P, !, S<sub>1</sub>, S<sub>0</sub> |
+
-
S<sub>0</sub> &larr;
+
-
Если условие P истинно, то решается S<sub>1</sub> и снова S<sub>0</sub>, если же P ложно, то S<sub>0</sub> считается решённой.
+
-
 
+
-
=== Задача 1 ===
+
-
Вычислить ответы на запрос G : ? A(x) к программе П
+
-
A(y) &larr; B(y), C(a<sub>2</sub>, y);
+
-
A(x) &larr; D(a<sub>1</sub>, x), C(x,y);
+
-
B(u) &larr; D(u, v), !, E(v);
+
-
B(v) &larr; E(a<sub>5</sub>);
+
-
E(a<sub>2</sub>) &larr; ;
+
-
E(a<sub>3</sub>) &larr; ;
+
-
E(z) &larr; ;
+
-
D(u, a<sub>1</sub>) &larr; C(u, f(u));
+
-
D(u, u) &larr; ;
+
-
D(x, a<sub>2</sub>) &larr; ;
+
-
C(z, a<sub>3</sub>) &larr; ;
+
-
 
+
-
=== Задача 2.1 ===
+
-
Вычисления наибольшего из двух чисел.
+
-
? max(x,y,z)
+
-
 
+
-
==== Решение ====
+
-
Если писать на императивном языке, то получим
+
-
if x &ge; y then z = x else z = y
+
-
Тогда, путём прямой трансляции:
+
-
max(x, y, z) &larr; x &ge; y, !, z = x;
+
-
max(x, y, z) &larr; z = y;
+
-
Можно оптимизировать:
+
-
max(x, y, y) &larr; x &lt; y, !;
+
-
max(x, y, z) &larr; ;
+
-
 
+
-
=== Задача 2.3 ===
+
-
Вычисления объединения L3 множеств L1 и L2, представленных бесповторными списками.
+
-
? cup(L1, L2, L3)
+
-
 
+
-
==== Решение ====
+
-
cup(L1, nil, L1) &larr; ;
+
-
cup(L1, x . L2, L3) &larr; elem(x, L1), !, cup(L1, L2, L3)
+
-
cup(L1, x . L2, x . L3) &larr; cup(L1, L2, L3);
+
-
Учитывая, что в объединении все элементы первого множества, то нужно позабодиться о том, чтобы там не повторялись элементы из второго списка, см. правило 2.
+
-
 
+
-
=== Задача 2.6 ===
+
-
Вычисления всех элементов целочисленного списка L1, квадраты которых не содержатся в этом списке.
+
-
? nonsquare(L1, L2)
+
-
 
+
-
==== Решение ====
+
-
Неправильное решение:
+
-
nonsquare(nil, nil) &larr; ;
+
-
nonsuare(x . L1, L2) &larr; z is x &times; x, elem(z, L1), !, nonsquare(L1, L2);
+
-
nonsquare(x . L1, x . L2) &larr; nonsquare(L1, L2);
+
-
Неправильность легко проверяется на списке 4 . 2 . 1 . nil. 4 — подходит, идём дальше. 2 — подходит (так как проверка идёт на списке 2 . 1 . nil), но не должно. Ошибка. необходимо ввести дополнительный предикат. Правильное решение:
+
-
nonsquare(L1, L2) &larr; nonsq(L1, L1, L2);
+
-
nonsq(L0, x . l1, L2) &larr; z is x &times; x, elem(z, L0), !, nonsq(L0, L1, L2);
+
-
nonsq(L0, x . L1, x . L2) &larr; nonsq()L0, L1, L2);
+
-
nonsq(L, nil, nil) &larr; ;
+
-
 
+
-
{{Математическая Логика}}
+

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Личные инструменты
Разделы