Мне интересно, какой лучший способ приблизиться к пониманию списков или декартовых продуктов в Агда.Agda: Формирование всех пар {(x, y) | x в xs, y в ys}
У меня есть два вектора, xs
и ys
. Я хочу (неформальный) набор {(x, y) | x в xs, y в ys}.
Я могу довольно легко сформировать этот набор, используя карту и CONCAT:
allPairs : {A : Set} -> {m n : ℕ} -> Vec A m -> Vec A n -> Vec (A × A) (m * n)
allPairs xs ys = Data.Vec.concat (Data.Vec.map (λ x -> Data.Vec.map (λ y -> (x , y)) ys ) xs)
Отсюда, я хотел бы кое-что для получения свидетельства для пар, что-то вроде:
pairWitness : ∀ {A} -> {m n : ℕ} -> (xv : Vec A m) -> (yv : Vec A n) -> (x : A) -> (y : A) -> x ∈ xv -> y ∈ yv -> (x , y) ∈ allPairs xv yv
Я надеваю Не знаю, как построить такого свидетеля. Насколько я могу судить, я теряю слишком много первоначальной структуры векторов, чтобы иметь возможность использовать мои индуктивные случаи.
Я задаюсь
- Есть ли что-то в стандартной библиотеке дело с такого рода «все пары» операции, которые уже доказали Леммы, как это?
- Если нет, то как мне поступить о создании свидетеля пары?
One Другим способом является разделение доказательства на две части. Первая часть - это «x ∈ xs -> y ∈ ys -> (x, y) ∈² xs × ² ys', где' _ × ²_' возвращает матрицу вместо вектора. Второй - это 'x ∈² xss -> x ∈ concat xss'. И '_∈_', и' _∈²_' могут быть представлены в терминах 'Any', поэтому я предполагаю, что существует возможность для дальнейшего обобщения. Если бы я писал библиотеку, я бы выбрал этот подход, но для простых упражнений это, вероятно, перебор. Кстати, нет тривиального анализа операторов mixfix, содержащих последовательности символов ASCII, например 'xs' в' _∈map_xs'. – user3237465
Я немного смущен ... что такое «Е» в «там» случае с парой Свидетелей? Я думал, что это конструктор типов, поэтому я смущен, увидев его в позиции значений. – jmite
Он исходит из этого идентификатора mixfix: '_∈ _ ++ ys'. Я попытался дать имена леммам, подчеркивающим, что они делают, но отсутствие подсветки синтаксиса в SO делает его довольно трудным для чтения. Я бы предложил загрузить суть и посмотреть на нее в emacs. Или я мог бы отредактировать мой ответ с переименованными леммами, если вы захотите. – gallais