You are on page 1of 9

Міністерство освіти і науки України

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»

Звіт

З лабораторної роботи №3

З дисципліни «Дискретна математика »

На тему: Властивості відношень

Виконав:

Прийняв:

Львів – 2020

Тема роботи: Властивості відношень.


Мета роботи: Ознайомитися з властивостями відношень та їх дослідженням.
Теоретичні відомості
Розглянемо декартовий добуток другого степеня множини Х, тобто Х^2 = Х
× Х. Довільну підмножину L множини Х^2 (L ⊆ Х 2 ) будемо називати
бінарним відношенням (або просто відношенням), заданим на множині Х.
Вважатимемо, що впорядковані елементи x, х' ∈ Х знаходяться між собою у
відношенні L, коли (x, х') ∈ L. Якщо на Х задано відношення L ⊆ X^2 , то
запис x L х' означає, що x і х' знаходяться у відношенні l, тобто (x, х') ∈ L.
Розглянемо кілька прикладів відношень: 1) на множині N відношення ≤ .
Ясно, що впорядковані пари (3, 7) і (5, 5) належать цьому відношенню, а пара
(4, 1) не належить; 2) на множині Р(Х) всіх підмножин множини Х = {1, 3, 5,
7, 9} відношення ⊆. Пари підмножин ({1, 3}, {1, 3, 9}) і ({5, 7, 9}, {5, 7, 9})
належать цьому відношенню, а пара підмножин ({1, 5, 7}, {3, 5, 9}) не
належить. Відношення L на множині X називають:
1) рефлективним, якщо довільний елемент множини знаходиться у
відношенні сам з собою, тобто для будь-якого х ∈ Х виконується х L х.
Прикладами рефлективних відношень можуть бути ≤, ≥, = на множині
натуральних чисел;
2) антирефлективним, якщо для будь-якого х ∈ Х пара (х, х) не належить до
відношення L. Прикладами антирефлективних відношень можуть бути , ≠ на
множині раціональних чисел;
3) симетричним, якщо для довільних x, х' ∈ Х з того, що x L х' випливає х' L
x. Наприклад, на множині Р(Х) відношення задане так: A, B∈ P(Х)
перебувають у відношенні, якщо A∩ B = ∅. Зокрема, якщо Х = {1, 3, 5, 7, 9},
то пара підмножин ({1, 3}, {5, 7, 9}) належить цьому відношенню, а пара
підмножин ({1, 5, 7}, {3, 5, 9}) не належить;
4) антисиметричним, якщо для довільних x, х' ∈ Х з того, що x L х' і х' L x,
випливає x = х' (наприклад, ≤ на N, тому що з x ≤ х' і х' ≤ x випливає х= х');
5) транзитивним, якщо для довільних x, х', х'' ∈ Х з того, що x L х' і х' L х'',
випливає x L х'' (наприклад, відношення ⊆ на множині Р(Х) чи відношення ≤
на множині N).
Хід виконання роботи
Завдання №1. Складіть програму, яка як вхідні дані одержує скінченну
множину з n>30 елементами та задане на ній відношення й досліджує
його властивості (рефлективність, симетрію, транзитивність).
Код програми
#include <iostream>
#include <random>
#include <time.h>

using namespace std;

bool reflective(int** arr, int s)


{
for (int i = 0; i < s; i++)
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
return true;
return false;
}
bool symmetry(int **arr, int s)
{
for (int i = 0; i < s; i++)
if (arr[0][i] == arr[2][i])
return true;
return false;
}
bool transitive(int** arr, int s)
{
for (int i = 0; i < s; i++)
for (int j = 0; j < s; j++)
if (arr[0][i] == arr[0][j] || arr[1][i] == arr[1][j] || arr[2][i] ==
arr[2][j])
return true;
return false;
}

int main()
{
srand(time(0));
const int n = 31;
int x, x1, y1, z1, s = 0;
bool tf, tfr, tfs, tft;
int arr[n];
int** array;
array = new int*[3];
char yn;

cout << "Do you want to fill in the array with your own numbers? - ";
cin >> yn;
if (yn == 'n') {
cout << "arr = ";
for (int i = 0; i < n; i++) {
arr[i] = rand() % 98 + 1;
cout << arr[i] << ", ";
}
cout << endl;
}else if(yn == 'y')
{
cout << "arr = ";
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << endl;
}
cout << "1 - x<=y<=z" << endl;
cout << "2 - x=>y=>z" << endl;
cout << "Choose the condition: ";
cin >> x;
if (x == 1)
tf = true;
else if (x == 2)
tf = false;

for (int i = 0; i < n; i++)


for (int j = i+1; j < n; j++)
for (int k = j+1; k < n; k++) {
x1 = arr[i]; y1 = arr[j]; z1 = arr[k];
if (tf == true && x1 <= y1 && y1 <= z1)
{
s++;
} else if(tf == false && x1 >= y1 && y1 >= z1)
{
s++;
}

}
for (int i = 0; i < 3; i++)
array[i] = new int[s];

int t = 0;
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
for (int k = j+1; k < n; k++) {
x1 = arr[i]; y1 = arr[j]; z1 = arr[k];
if (tf == true && x1 <= y1 && y1 <= z1)
{
array[0][t] = x1;
array[1][t] = y1;
array[2][t] = z1;
t++;
}
else if (tf == false && x1 >= y1 && y1 >= z1)
{
array[0][t] = x1;
array[1][t] = y1;
array[2][t] = z1;
t++;
}

}
for (int j = 0; j < s; j++) {
cout << "arr = ";
for (int i = 0; i < 3; i++) {
cout << array[i][j];
cout << ", ";
}
cout << endl;
}

tfr = reflective(array, s);


tfs = symmetry(array, s);
tft = transitive(array, s);
cout << "attitude: ";
if (tfr == true)
cout << "reflective ";
if (tfs == true)
cout << "symmetry ";
if (tft == true)
cout << "transitive ";
if (tfr == false && tfs == false && tft == false)
cout << "none";

cout << endl;

for (int i = 0; i < 3; i++)


delete[] array[i];
delete[] array;

return 0;
}
Завдання №2 Складіть програму, яка як вхідні дані одержує скінченну
множину з n>30 елементами та задає на ній відношення із заданими
властивостями (рефлективність, симетрію, транзитивність).
#include <iostream>
#include <random>
#include <time.h>

using namespace std;

void reflective(int** arr, int s)


{
cout << "F = {";
for (int i = 0; i < s; i++)
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
cout << "(" << arr[0][i] << ", " << arr[1][i] << ", " << arr[2][i]
<< "), ";
cout << "}";
}
void symmetry(int** arr, int s)
{
cout << "F = {";
for (int i = 0; i < s; i++)
if (arr[0][i] == arr[2][i])
cout << "(" << arr[0][i] << ", " << arr[1][i] << ", " << arr[2][i]
<< "), ";
cout << "}";
}
void transitive(int** arr, int s)
{
int k = 0;
cout << "F = {";
for (int i = 0; i < s; i++)
for (int j = 0; j < s; j++)
if ((arr[0][i] == arr[0][j] && arr[1][i] == arr[1][j]) || (arr[2][i]
== arr[2][j] && arr[1][i] == arr[1][j]) && i != j) {
cout << "(" << arr[0][j] << ", " << arr[1][j] << ", " <<
arr[2][j] << "), ";

}
cout << "}";
}

int main()
{
srand(time(0));
const int n = 7;
int n1, n2;
int x1, y1, z1, s = 0;
int arr[n];
bool tf;
int** array;
array = new int* [3];
char yn;

cout << "Do you want to fill in the array with your own numbers? - ";
cin >> yn;
if (yn == 'n') {
cout << "arr = ";
for (int i = 0; i < n; i++) {
arr[i] = rand() % 98 + 1;
cout << arr[i] << ", ";
}
cout << endl;
}
else if (yn == 'y')
{
cout << "arr = ";
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << endl;
}

cout << "1 - reflective" << endl;


cout << "2 - symmetry" << endl;
cout << "3 - transitive" << endl;
cout << "Choose the attitude: ";
cin >> n1;
cout << "\n1 - x<=y<=z" << endl;
cout << "2 - x=>y=>z" << endl;
cout << "Choose the condition: ";
cin >> n2;

if (n2 == 1)
tf = true;
else if (n2 == 2)
tf = false;

for (int i = 0; i < n; i++)


for (int j = i + 1; j < n; j++)
for (int k = j + 1; k < n; k++) {
x1 = arr[i]; y1 = arr[j]; z1 = arr[k];
if (tf == true && x1 <= y1 && y1 <= z1)
{
s++;
}
else if (tf == false && x1 >= y1 && y1 >= z1)
{
s++;
}

}
for (int i = 0; i < 3; i++)
array[i] = new int[s];

int t = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
for (int k = j + 1; k < n; k++) {
x1 = arr[i]; y1 = arr[j]; z1 = arr[k];
if (tf == true && x1 <= y1 && y1 <= z1)
{
array[0][t] = x1;
array[1][t] = y1;
array[2][t] = z1;
t++;
}
else if (tf == false && x1 >= y1 && y1 >= z1)
{
array[0][t] = x1;
array[1][t] = y1;
array[2][t] = z1;
t++;
}

switch (n1)
{
case 1:
{
reflective(array, s);
}break;
case 2:
{
symmetry(array, s);
}break;
case 3:
{
transitive(array, s);
}break;
default:
cout << "You put wrong number";
}

return 0;
}
ПОЯСНЕННЯ
1 завдання:
Користувач вирішує чи заповнювати множину(масив) вручну або
автоматично, натискаючи y – вручну, n – автоматично. Далі користувач
обирає відношення(їх всього два, довільні відношення x=>y=>z та x<=y<=z).
Далі в потрійному циклі перебираємо всі елементи множини і рахуємо
кількість елементів які підходять під обрану властивість. Далі виділяємо
пам'ять з кількістю елементів та добавляємо ті елементи у подвійний масив.
Далі йде дослідження по елементам по всім властивостям(рефлексивність,
симетрія або транзитивність) потім вивід на екран тих властивостей які
присутні, якщо ні то вивід на екран none.
2 завдання:
Користувач вирішує чи заповнювати множину(масив) вручну або
автоматично, натискаючи y – вручну, n – автоматично. Далі користувач
обирає властивість на яку буде йти дослід(рефлексивність, симетрія або
транзитивність) та відношення(їх всього два, довільні відношення x=>y=>z та
x<=y<=z). Далі в потрійному циклі перебираємо всі елементи множини і
рахуємо кількість елементів які підходять під обрану властивість. Далі
виділяємо пам'ять з кількістю елементів та добавляємо ті елементи у
подвійний масив. Далі по обраній властивості йде дослід з виводом на екран
тих елементів які підходять по властивості.

Висновок
Ми ознайомитися з властивостями відношень та їх дослідженням.

You might also like