Wypróbuj sam  ·  Operator interlace

Dwa zegary.
Jeden strumień, bez strat.

Podaj dwa ciągi oraz odstęp między kolejnymi elementami każdego z nich (jako liczbę wymierną, np. 2/3, lub dziesiętną, np. 0.5). Operator scala je w jeden połączony ciąg o połączonym odstępie Δc = Δ1·Δ2 / (Δ1+Δ2).

Δc = Δ1·Δ2 / (Δ1+Δ2)  ·  RQL: FROM core0#core1
Jak to działa

Scalenie, które zawsze można cofnąć

Interlace tka dwa regularne strumienie w jeden, w kolejności czasu. Połączony strumień tyka częściej niż którekolwiek wejście, bo musi pomieścić każdy element obu.

Kompletność

Każdy element obu wejść pojawia się w wyniku dokładnie raz, w kolejności, w jakiej jego takt wypada na osi czasu. Nic nie jest gubione ani powtarzane.

Odwracalność

Połączony strumień zawsze da się rozdzielić na dokładnie te dwa zegary, z których powstał. Scalanie i rozdzielanie są operacjami odwrotnymi.

Dokładność

To, które wejście dostarcza dany takt, wyznacza wymierny ciąg Beatty’ego; twierdzenie o podziale Fraenkla gwarantuje, że oba zbiory pozycji pokrywają wynik dokładnie, bez nakładania się.

RQL w praktyce

Ten sam operator w zapytaniu

W RQL interlace zapisuje się jako # między dwoma strumieniami. Tutaj core0 tyka co 1/16, a core1 co 1/8, więc str3 tyka co 1/24.

query.rql test/IntegrationTest/operations
DECLARE a UINT STREAM core0, 1/16 FILE 'datafile1.txt'
DECLARE a UINT STREAM core1, 1/8 FILE 'datafile2.txt' ONESHOT
SELECT str3[0] STREAM str3 FROM core0#core1

Formalna definicja i dowód znajdują się w artykule. Algebra operatorów jest streszczona na stronie głównej.