В данной лекции мы попробуем реализовать некоторое приближение математического понятия
Итак, что мы будем понимать под
На самом деле я не знаю ни одной реализации понятия
Нам предстоит разработать предикаты, которые реализуют основные теоретико-множественные операции.
Начнем с написания предиката, превращающего произвольный список во delete_all, который был создан нами ранее, в седьмой лекции. Предикат будет иметь два аргумента: первый — исходный список (возможно, содержащий повторные вхождения элементов), второй — выходной (то, что остается от первого аргумента после удаления повторных вхождений элементов).
Предикат будет реализован посредством рекурсии. Базисом рекурсии является очевидный факт: в пустом списке никакой элемент не встречается более одного раза. По правде говоря, в пустом списке нет ни одного элемента, который встречался бы в нем хотя бы один раз, то есть в нем вообще нет элементов. Шаг рекурсии позволит выполнить правило: чтобы сделать из непустого списка
Закодируем наши рассуждения.
list_set([],[]). /* пустой список является множеством
в нашем понимании */
list_set ([H|T],[H|T1]) :–
delete_all(H,T,T2),
/* T2 — результат удаления
вхождений первого элемента
исходного списка H из хвоста T */
list_set (T2,T1).
/* T1 — результат удаления
повторных вхождений элементов
из списка T2 */
Например, если применить этот предикат к списку [1,2,1,2,3, 2,1], то результатом будет список [1,2,3].
Заметим, что в предикате, обратном только что записанному предикату list_set и переводящем
Теперь займемся реализацией теоретико-множественных операций, таких как
При реализации этих предикатов можно было бы воспользоваться предикатами, предназначенными для работы с обыкновенными списками, но в результате их применения могут получаться списки, содержащие некоторые элементы несколько раз, даже если исходные списки были
Можно, конечно, после каждого применения теоретико-множественной операции превращать полученный список обратно во list_set, но это было бы не очень удобно. Вместо этого мы попробуем написать каждую из теоретико-множественных операций так, чтобы в результате ее работы гарантированно получалось
Итак, приступим.
В качестве реализации операции member3, который мы разработали в седьмой лекции, когда только начинали знакомиться со списками. Напомним, что факт x A в математике принято обозначать следующим образом: $$x\in A$$.
Для того чтобы найти length, рассмотренный нами в седьмой лекции. Напомним, что
Пример. Реализуем A и B через $$A\cup B$$. В математической записи это выглядит следующим образом: $$A\cup B=\{ x | x\in A \ или \ x\in B\}$$ A и B обозначено штриховкой.
(рис 9.1) Объединение множеств A и BУ соответствующего этой операции предиката должно быть три параметра: первые два — conc (который мы рассмотрели в седьмой лекции), предназначенным для conc нужно написать новый предикат, применение которого не приведет к ситуации, в которой итоговый список уже не будет
Без рекурсии мы не обойдемся и здесь. Будем вести рекурсию по первому из
Давайте запишем эти рассуждения:
union([ ],S2,S2). /* результатом объединения
пустого множества со множеством S2
будет множество S2 */
union([H|T],S2,S):–
member3(H,S2),
/* если голова первого
множества H принадлежит второму
множеству S2, */
!,
union(T,S2,S).
/* то результатом S будет
объединение хвоста первого
множества T и второго
множества S2 */
union([H |T],S2,[H|S]):–
union(T,S2,S).
/* в противном случае результатом
будет множество, образованное
головой первого множества H
и хвостом, полученным объединением
хвоста первого множества T
и второго множества S2 */
Если [1,2,3,4] со [3,4,5], то в результате получится [1,2,3,4,5].
Пример. Теперь можно приступить к реализации A и B через $$A\cap B$$. В математических обозначениях это выглядит следующим образом: $$A\cap B=\{ x|x\in A и x\in B\}$$ A и B обозначено штриховкой.
(рис 9.2) Пересечение множеств A и BУ предиката, реализующего эту операцию, как и у предиката, осуществляющего
Этот предикат, наверное, будет немного проще
Запишем это.
intersection([],_,[]). /* в результате пересечения
пустого множества с любым
множеством получается пустое
множество */
intersection([H|T1],S2,[H|T]):–
member3(H,S2),
/* если голова первого множества H
принадлежит второму множеству S2 */
!,
intersection(T1,S2,T).
/* то результатом будет множество,
образованное головой первого
множества H и хвостом, полученным
пресечением хвоста первого
множества T1 со вторым
множеством S2 */
intersection([_|T],S2,S):–
intersection(T,S2,S).
/* в противном случае результатом
будет множество S, полученное
объединением хвоста первого
множества T со вторым
множеством S2 */
Если [1,2,3,4] со [3,4,5], то в результате получится [3,4].
Пример. Следующая операция, которую стоит реализовать, — это A и B через A–B или A\B. В математических обозначениях это выглядит следующим образом: $$A\setminus B=\{ x|x\in A и х\notin B\}$$
На рисунках A и B ( B и A ) обозначена штриховкой.

(рис 9.4) Разность множеств A и B(рис 9.3) Разность множеств В и АВ этой операции, в отличие от двух предыдущих, важен порядок A={1,2,3,4}, B={3,4,5}, A\B={1,2}, но B\A={5}.
У предиката, реализующего
Рекурсия по первому
Запишем эти рассуждения.
minus([],_,[]). /* при вычитании любого множества
из пустого множества получится пустое
множество */
minus([H|T],S2,S):–
member3(H,S2),
/* если первый элемент первого
множества H принадлежит второму
множеству S2*/
!,
minus(T,S2,S).
/* то результатом S будет разность
хвоста первого множества T
и второго множества S2 */
minus([H|T],S2,[H|S]):–
minus(T,S2,S).
/* в противном случае, результатом
будет множество, образованное
первым элементом первого
множества H и хвостом, полученным
вычитанием из хвоста первого
множества T второго множества S2 */
Можно попробовать реализовать
intersection2(A,B,S):–
minus(A,B,A_B), /*A_B=A\B */
minus(A,A_B,S). /* S = A\A_B = A\(A\B) */
Проверка на примерах показывает, что этот предикат, так же, как, впрочем, и ранее созданный предикат intersection, возвращает именно те результаты, которые ожидаются.
Пример. Не помешает иметь предикат, позволяющий проверить, является ли одно A является подмножеством B, обозначается через $$A\subseteq B$$. В математической записи это выглядит следующим образом: $$A\subseteq B\Leftrightarrow \forall x(x\in A \to x\in B)$$.
Предикат, реализующий данное отношение, будет иметь два параметра, оба входные. В качестве первого параметра будем указывать
Решение, как обычно, будет рекурсивным. Базис рекурсии будет представлен фактом, утверждающим, что пустое
member3, рассмотренный нами ранее в седьмой лекции), а его хвост, в свою очередь, должен быть подмножеством второго
subset([],_). /* пустое множество является
подмножеством любого множества */
subset([H|T],S):– /* множество [H|T] является
подмножеством множества S */
member3(H,S), /* если его первый элемент H
принадлежит S */
subset(T,S). /* и его хвост T является
подмножеством множества S */
Можно также определить это отношение, воспользовавшись уже определенными предикатами union и intersection.
Из математики известно, что $$A\subseteq B\Leftrightarrow A\cup B=B$$. То есть одно
Запишем эти математические соотношения на Прологе.
subsetU(A,B):–
union(A,B,B). /* объединение множеств
совпадает со вторым множеством */
subsetI(A,B):–
intersection(A,B,A).
/* пересечение множеств
совпадает с первым множеством*/
Проверка на примерах показывает, что оба предиката, как и ранее созданный предикат subset, возвращают именно те результаты, какие и должны возвращать.
Используя только что написанный предикат, реализующий отношение A и B называются равными, если одновременно выполнено $$A\subseteq B$$ и $$B\subseteq A$$, т.е. A содержится во B и B содержится во A. Другими словами, два
Напишем предикат, реализующий отношение равенства двух
equal(A,B):– /* множество A совпадает
со множеством B, */
subset(A,B), /* если множество A содержится
во множестве B */
subset(B,A). /* и множество B является
подмножеством множества A*/
Убедимся, что [1,2,3] и [3,4,5] не равны, а [1,2,3] и [2,1,3] совпадают.
Если A содержится во B, причем во В имеются элементы, А, то говорят, что А — собственное подмножество В. Обозначается этот факт как $$A\subset B$$.
Закодируем это отношение:
Prop_subset(A,B):–
subset(A,B),
/* множество A содержится
во множестве B */
not(equal(A,B)).
/* множества A и B не совпадают*/
Проверим, что [1,3] является собственным подмножеством [1,2,3], в отличие от [1,4] и [2,1,3].
Пример. Рассмотрим еще одну операцию на A и B через $$A\Delta B$$. В математических обозначениях это выглядит следующим образом: $$A\Delta B=\{ x|(x\in A и x\notin B) или (x\in B и x\notin A)\}$$. В отличие от обычной
(рис 9.5) Симметрическая разность множеств А и ВНапример, при A={1,2,3,4}, B={3,4,5}, $$A\Delta B=B\Delta A=\{ 1,2,5\}$$.
Воспользуемся тем, что симметрическую разность можно выразить через уже реализованные нами операции. А именно, $$A\Delta B=(A\setminus B)\cup (B\setminus A)$$. Словесно эта формула читается так: симметрическая разность двух
Запишем это на Прологе:
Sim_minus(A,B,SM):–
minus(A,B,A_B), /* A_B — это разность
множеств A и B */
minus(B,A,B_A), /* B_A — это разность
множеств B и A */
union(A_B,B_A,SM). /* SM — это объединение
множеств A_B и B_A */
Убедимся, что симметрическая разность [1,2,3,4] и [3,4,5] равна [1,2,5], а симметрическая разность [3,4,5] и [1,2,3,4] равна [5,1,2]. [1,2,5] с точностью до порядка элементов совпадает с [5,1,2]. Таким образом, мы выяснили, что результат не зависит от порядка аргументов.
Пример. Еще одна операция, которую обычно используют при работе со A через . В математических обозначениях это выглядит следующим образом: $$\overline A=\{ x|x\notin A\}$$
Давайте, для определенности, возьмем в качестве универсального {0,1,2,3,4,5,6,7,8,9} ). Напишем
Воспользуемся при этом очередным тождеством, которое известно в математике. А именно, тем, что , где символ U обозначает универсальное
Закодируем вышеприведенную формулу на Прологе.
supp(A,D):–
U=[0,1,2,3,4,5,6,7,8,9],
minus(U,A,D). /* D — это разность
универсального множества U
и множества A */
Проверяем, что [1,2,3,4] равно [0,5,6,7,8,9].
Имея
Запишем эти соотношения на Прологе.
unionI(A,B,AB):–
supp(A,A_), /* A_ — это дополнение
множества A */
supp(B,B_), /* B_ — это дополнение
множества B */
intersection(A_,B_,A_B),
/* A_B — это пересечение
множеств A_ и B_ */
supp(A_B,AB). /* AB — это дополнение
множества A_B */
intersectionU(A,B,AB):–
supp(A,A_), /* A_ — это дополнение
множества A */
supp(B,B_), /* B_ — это дополнение
множества B */
union(A_,B_,A_B), /* A_B — это объединение
множеств A_ и B_ */
supp(A_B,AB). /* AB — это дополнение
множества A_B */
Проверка на примерах показывает, что оба предиката работают на {0,1,2,3,4,5,6,7,8,9} ), как и ранее созданные предикаты union и intersection.
В данной лекции мы попробуем реализовать некоторое приближение математического понятия
Итак, что мы будем понимать под
На самом деле я не знаю ни одной реализации понятия
Нам предстоит разработать предикаты, которые реализуют основные теоретико-множественные операции.
Начнем с написания предиката, превращающего произвольный список во delete_all, который был создан нами ранее, в седьмой лекции. Предикат будет иметь два аргумента: первый — исходный список (возможно, содержащий повторные вхождения элементов), второй — выходной (то, что остается от первого аргумента после удаления повторных вхождений элементов).
Предикат будет реализован посредством рекурсии. Базисом рекурсии является очевидный факт: в пустом списке никакой элемент не встречается более одного раза. По правде говоря, в пустом списке нет ни одного элемента, который встречался бы в нем хотя бы один раз, то есть в нем вообще нет элементов. Шаг рекурсии позволит выполнить правило: чтобы сделать из непустого списка
Закодируем наши рассуждения.
list_set([],[]). /* пустой список является множеством
в нашем понимании */
list_set ([H|T],[H|T1]) :–
delete_all(H,T,T2),
/* T2 — результат удаления
вхождений первого элемента
исходного списка H из хвоста T */
list_set (T2,T1).
/* T1 — результат удаления
повторных вхождений элементов
из списка T2 */
Например, если применить этот предикат к списку [1,2,1,2,3, 2,1], то результатом будет список [1,2,3].
Заметим, что в предикате, обратном только что записанному предикату list_set и переводящем
Теперь займемся реализацией теоретико-множественных операций, таких как
При реализации этих предикатов можно было бы воспользоваться предикатами, предназначенными для работы с обыкновенными списками, но в результате их применения могут получаться списки, содержащие некоторые элементы несколько раз, даже если исходные списки были
Можно, конечно, после каждого применения теоретико-множественной операции превращать полученный список обратно во list_set, но это было бы не очень удобно. Вместо этого мы попробуем написать каждую из теоретико-множественных операций так, чтобы в результате ее работы гарантированно получалось
Итак, приступим.
В качестве реализации операции member3, который мы разработали в седьмой лекции, когда только начинали знакомиться со списками. Напомним, что факт x A в математике принято обозначать следующим образом: $$x\in A$$.
Для того чтобы найти length, рассмотренный нами в седьмой лекции. Напомним, что
Пример. Реализуем A и B через $$A\cup B$$. В математической записи это выглядит следующим образом: $$A\cup B=\{ x | x\in A \ или \ x\in B\}$$ A и B обозначено штриховкой.
(рис 9.1) Объединение множеств A и BУ соответствующего этой операции предиката должно быть три параметра: первые два — conc (который мы рассмотрели в седьмой лекции), предназначенным для conc нужно написать новый предикат, применение которого не приведет к ситуации, в которой итоговый список уже не будет
Без рекурсии мы не обойдемся и здесь. Будем вести рекурсию по первому из
Давайте запишем эти рассуждения:
union([ ],S2,S2). /* результатом объединения
пустого множества со множеством S2
будет множество S2 */
union([H|T],S2,S):–
member3(H,S2),
/* если голова первого
множества H принадлежит второму
множеству S2, */
!,
union(T,S2,S).
/* то результатом S будет
объединение хвоста первого
множества T и второго
множества S2 */
union([H |T],S2,[H|S]):–
union(T,S2,S).
/* в противном случае результатом
будет множество, образованное
головой первого множества H
и хвостом, полученным объединением
хвоста первого множества T
и второго множества S2 */
Если [1,2,3,4] со [3,4,5], то в результате получится [1,2,3,4,5].
Пример. Теперь можно приступить к реализации A и B через $$A\cap B$$. В математических обозначениях это выглядит следующим образом: $$A\cap B=\{ x|x\in A и x\in B\}$$ A и B обозначено штриховкой.
(рис 9.2) Пересечение множеств A и BУ предиката, реализующего эту операцию, как и у предиката, осуществляющего
Этот предикат, наверное, будет немного проще
Запишем это.
intersection([],_,[]). /* в результате пересечения
пустого множества с любым
множеством получается пустое
множество */
intersection([H|T1],S2,[H|T]):–
member3(H,S2),
/* если голова первого множества H
принадлежит второму множеству S2 */
!,
intersection(T1,S2,T).
/* то результатом будет множество,
образованное головой первого
множества H и хвостом, полученным
пресечением хвоста первого
множества T1 со вторым
множеством S2 */
intersection([_|T],S2,S):–
intersection(T,S2,S).
/* в противном случае результатом
будет множество S, полученное
объединением хвоста первого
множества T со вторым
множеством S2 */
Если [1,2,3,4] со [3,4,5], то в результате получится [3,4].
Пример. Следующая операция, которую стоит реализовать, — это A и B через A–B или A\B. В математических обозначениях это выглядит следующим образом: $$A\setminus B=\{ x|x\in A и х\notin B\}$$
На рисунках A и B ( B и A ) обозначена штриховкой.

(рис 9.4) Разность множеств A и B(рис 9.3) Разность множеств В и АВ этой операции, в отличие от двух предыдущих, важен порядок A={1,2,3,4}, B={3,4,5}, A\B={1,2}, но B\A={5}.
У предиката, реализующего
Рекурсия по первому
Запишем эти рассуждения.
minus([],_,[]). /* при вычитании любого множества
из пустого множества получится пустое
множество */
minus([H|T],S2,S):–
member3(H,S2),
/* если первый элемент первого
множества H принадлежит второму
множеству S2*/
!,
minus(T,S2,S).
/* то результатом S будет разность
хвоста первого множества T
и второго множества S2 */
minus([H|T],S2,[H|S]):–
minus(T,S2,S).
/* в противном случае, результатом
будет множество, образованное
первым элементом первого
множества H и хвостом, полученным
вычитанием из хвоста первого
множества T второго множества S2 */
Можно попробовать реализовать
intersection2(A,B,S):–
minus(A,B,A_B), /*A_B=A\B */
minus(A,A_B,S). /* S = A\A_B = A\(A\B) */
Проверка на примерах показывает, что этот предикат, так же, как, впрочем, и ранее созданный предикат intersection, возвращает именно те результаты, которые ожидаются.
Пример. Не помешает иметь предикат, позволяющий проверить, является ли одно A является подмножеством B, обозначается через $$A\subseteq B$$. В математической записи это выглядит следующим образом: $$A\subseteq B\Leftrightarrow \forall x(x\in A \to x\in B)$$.
Предикат, реализующий данное отношение, будет иметь два параметра, оба входные. В качестве первого параметра будем указывать
Решение, как обычно, будет рекурсивным. Базис рекурсии будет представлен фактом, утверждающим, что пустое
member3, рассмотренный нами ранее в седьмой лекции), а его хвост, в свою очередь, должен быть подмножеством второго
subset([],_). /* пустое множество является
подмножеством любого множества */
subset([H|T],S):– /* множество [H|T] является
подмножеством множества S */
member3(H,S), /* если его первый элемент H
принадлежит S */
subset(T,S). /* и его хвост T является
подмножеством множества S */
Можно также определить это отношение, воспользовавшись уже определенными предикатами union и intersection.
Из математики известно, что $$A\subseteq B\Leftrightarrow A\cup B=B$$. То есть одно
Запишем эти математические соотношения на Прологе.
subsetU(A,B):–
union(A,B,B). /* объединение множеств
совпадает со вторым множеством */
subsetI(A,B):–
intersection(A,B,A).
/* пересечение множеств
совпадает с первым множеством*/
Проверка на примерах показывает, что оба предиката, как и ранее созданный предикат subset, возвращают именно те результаты, какие и должны возвращать.
Используя только что написанный предикат, реализующий отношение A и B называются равными, если одновременно выполнено $$A\subseteq B$$ и $$B\subseteq A$$, т.е. A содержится во B и B содержится во A. Другими словами, два
Напишем предикат, реализующий отношение равенства двух
equal(A,B):– /* множество A совпадает
со множеством B, */
subset(A,B), /* если множество A содержится
во множестве B */
subset(B,A). /* и множество B является
подмножеством множества A*/
Убедимся, что [1,2,3] и [3,4,5] не равны, а [1,2,3] и [2,1,3] совпадают.
Если A содержится во B, причем во В имеются элементы, А, то говорят, что А — собственное подмножество В. Обозначается этот факт как $$A\subset B$$.
Закодируем это отношение:
Prop_subset(A,B):–
subset(A,B),
/* множество A содержится
во множестве B */
not(equal(A,B)).
/* множества A и B не совпадают*/
Проверим, что [1,3] является собственным подмножеством [1,2,3], в отличие от [1,4] и [2,1,3].
Пример. Рассмотрим еще одну операцию на A и B через $$A\Delta B$$. В математических обозначениях это выглядит следующим образом: $$A\Delta B=\{ x|(x\in A и x\notin B) или (x\in B и x\notin A)\}$$. В отличие от обычной
(рис 9.5) Симметрическая разность множеств А и ВНапример, при A={1,2,3,4}, B={3,4,5}, $$A\Delta B=B\Delta A=\{ 1,2,5\}$$.
Воспользуемся тем, что симметрическую разность можно выразить через уже реализованные нами операции. А именно, $$A\Delta B=(A\setminus B)\cup (B\setminus A)$$. Словесно эта формула читается так: симметрическая разность двух
Запишем это на Прологе:
Sim_minus(A,B,SM):–
minus(A,B,A_B), /* A_B — это разность
множеств A и B */
minus(B,A,B_A), /* B_A — это разность
множеств B и A */
union(A_B,B_A,SM). /* SM — это объединение
множеств A_B и B_A */
Убедимся, что симметрическая разность [1,2,3,4] и [3,4,5] равна [1,2,5], а симметрическая разность [3,4,5] и [1,2,3,4] равна [5,1,2]. [1,2,5] с точностью до порядка элементов совпадает с [5,1,2]. Таким образом, мы выяснили, что результат не зависит от порядка аргументов.
Пример. Еще одна операция, которую обычно используют при работе со A через . В математических обозначениях это выглядит следующим образом: $$\overline A=\{ x|x\notin A\}$$
Давайте, для определенности, возьмем в качестве универсального {0,1,2,3,4,5,6,7,8,9} ). Напишем
Воспользуемся при этом очередным тождеством, которое известно в математике. А именно, тем, что , где символ U обозначает универсальное
Закодируем вышеприведенную формулу на Прологе.
supp(A,D):–
U=[0,1,2,3,4,5,6,7,8,9],
minus(U,A,D). /* D — это разность
универсального множества U
и множества A */
Проверяем, что [1,2,3,4] равно [0,5,6,7,8,9].
Имея
Запишем эти соотношения на Прологе.
unionI(A,B,AB):–
supp(A,A_), /* A_ — это дополнение
множества A */
supp(B,B_), /* B_ — это дополнение
множества B */
intersection(A_,B_,A_B),
/* A_B — это пересечение
множеств A_ и B_ */
supp(A_B,AB). /* AB — это дополнение
множества A_B */
intersectionU(A,B,AB):–
supp(A,A_), /* A_ — это дополнение
множества A */
supp(B,B_), /* B_ — это дополнение
множества B */
union(A_,B_,A_B), /* A_B — это объединение
множеств A_ и B_ */
supp(A_B,AB). /* AB — это дополнение
множества A_B */
Проверка на примерах показывает, что оба предиката работают на {0,1,2,3,4,5,6,7,8,9} ), как и ранее созданные предикаты union и intersection.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.