Z Обозначение: последовательность последовательностей — найти сумму

#formal-methods #z-notation

#формальные методы #z-нотация

Вопрос:

Позвольте мне просто сказать, что это для университетского проекта. Я не ожидаю ответа, а скорее «подсказки».

У меня есть схема супермаркета, которая содержит последовательность очередей:

  -- Supermarket-------
|queues: seq Queue
----------------------
 

И вот как я определил очередь:

  -- Queue ----------
|length: ℕ
--------------------
 

Я хочу определить схему, которая возвращает общее количество клиентов, ожидающих в очереди. До сих пор у меня есть:

  --TotalQueueCustomers----
|Ξsupermarket: Supermarket
|totalCustomers!: ℕ
|-------------------------
|totalCustomers = total θ supermarket
--------------------------
 

Я борюсь с определением total функции. Он должен «зацикливать» каждого клиента в каждой очереди и суммировать их length . Вот что у меня есть до сих пор: total = q: Queue ⦁ q.length ↦ q.length

Есть идеи?

Ответ №1:

Вы можете определить функцию индуктивно, имея базовый вариант (без очередей) и указав, как вычисляется дополнительная очередь:

 total: seq Queue → ℕ
---
total(∅) = 0
∀ q: Queue; qs: seq Queue ⦁ total( <q> ^ qs ) = q.length   total(qs)
 

<q> последовательность, имеющая один элемент q , a ^ b обозначает оператор конкатенации последовательности (раздел 4.5 справочного руководства по Z).

(Пожалуйста, обратите внимание: я не проверял этот пример с помощью средства проверки типов Z, поэтому он, вероятно, содержит какую-то синтаксическую ошибку — но идея должна быть ясна)