Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комп'ютерна алгебра.Навчально-методичний посібн...doc
Скачиваний:
17
Добавлен:
24.08.2019
Размер:
683.01 Кб
Скачать

3.5 Тотожність і рівність списків

Для вивчення способів управління складними структурами даних в GAP важливо розуміти відмінності між тотожними і рівними об'єктами. У даному розділі ця відмінність демонструється на прикладі списків. Аналогічні приклади можуть бути підібрані і для записів.

Два списки рівні (тобто оператор порівняння = повертає true) тоді і тільки тоді, коли вони мають однакову довжину і їх відповідні елементи рівні.

Приклад:

gap> numbers:= primes; [ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,,,,,,71 ] gap> numbers = primes; true

Тепер змінимо список numbers і знову порівняємо його з primes .

gap> primes[3]:= 4; 4 gap> numbers = primes; true

Виявляється, що списки numbers і primes знову рівні, а роздрукувавши список primes, ми побачимо, що primes[3]=4. Це пояснюється тим, що списки primes і numbers не тільки рівні, але і ідентичні. Ідентифікатори primes і numbers указують на один і той же список, і зміни в нім відбуваються при вказівці будь-якого з його імен. Привласнення numbers:= primes створює не новий список, а тільки нове ім'я для вже існуючого списку.

Якщо необхідно змінити список, співпадаючий за змістом з primes, так, щоб сам список primes при цьому не змінився, необхідно створити копію списку primes за допомогою функції Shallowcopy (у наступному прикладі заздалегідь відновимо старе значення primes)

gap> primes[3]:= 5; 5 gap> primes; [ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,,,,,,71 ] gap> numbers:= Shallowcopy(primes); [ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,,,,,,71 ] gap> numbers = primes; true gap> numbers[3]:= 4; 4 gap> numbers = primes; false

Примітка. Єдиними об'єктами, які можуть бути змінені у такий спосіб, є списки і записи, оскільки тільки ці об'єкти в GAP можуть складатися з інших об'єктів. Наприклад, після виконання наступних команд значення i і j відповідно дорівнюватимуть 2 і 1:

gap> i:= 1;; j:= i;; i:= i+1;;

Вправа. Пояснити, що відбувається в результаті виконання команд:

gap> l:= []; [ ] gap> l:= [l]; [ [ ] ] gap> l[1]:= l;

3.6 Множини

Множинами в GAP називаються списки спеціального вигляду. Елементи множини розташовані послідовно (тобто не содржат пропусків, як, наприклад, список [2,3,5,,,,,,,,31,37,41]), впорядковані (порядок сортування GAP визначає самостійно) і зустрічаються в списку тільки один раз. Множини, як і списки, можуть містити об'єкти різних типів.

Перевірити, чи є об'єкт множиною, можна за допомогою функції Isset. Для кожного списку існує відповідна йому множина, що отримується за допомогою функції Set.

Приклад:

gap> fruits:=["apple", "strawberry", "cherry", "plum", "apple"];; gap> Isset(fruits); false gap> fruits:= Set(fruits); [ "apple", "cherry", "plum", "strawberry" ]

Відмітимо, що при цьому початковий список fruits був змінений.

Для перевірки приналежності об'єкту множині використовується оператор in. Його також можна використовувати для перевірки приналежності до списку, проте в першому випадку перевірка виконується швидше, оскільки сортування дозволяє використовувати двійковий пошук замість послідовного перебору.

gap> "apple" in fruits; true gap> "banana" in fruits; false

Додати до множини новий елемент можна за допомогою функції Addset (звернете увагу на порядок проходження елементів):

gap> Addset(fruits, "banana"); gap> fruits; ["apple", "banana", "cherry", "plum", "strawberry"] gap> Addset(fruits, "apple"); gap> fruits; # 'fruits' не змінилося ["apple", "banana", "cherry", "plum", "strawberry"]

Перетин, об'єднання і різниця множин визначаються за допомогою функцій Intersection, Union і Difference . При цьому аргументи можуть бути звичайними списками, тоді як результат завжди буде множиною.

Приклад:

gap> breakfast:= ["tea", "apple", "egg"]; [ "tea", "apple", "egg" ] gap> Intersection(breakfast, fruits); [ "apple" ] gap> Difference(breakfast,fruits); [ "egg", "tea" ]

Ті ж операції над множинами проводять функції Intersectset, Uniteset і Removeset, але вони не повертають результат, а замінюють ним перший аргумент.