Чтобы создать функцию среза, которая имеет нижний и верхний индексы и размер списка в качестве параметров, чтобы при нарезке списка с учетом этих параметров она работала как функция сбора.
Я попытался определить его, используя концепцию фильтра, и снабдить его функцией тестирования.Пожалуйста, смотрите мой код ниже
Require Import PeanoNat.
Require Import Coq.Init.Datatypes.
Require Import Notations.
Import Basics.
Fixpoint filter_index {X: Type} (currInd : nat) (test: nat -> bool) (l: list X ): list X :=
match l with
| [] => []
| h::t => if test currInd then h :: filter_index (S currInd) test t else filter_index (S currInd) test t
end.
Definition slicing_ring (tail head sz: nat) : nat -> bool :=
fun n => if sz <=? head then orb ( n <=? head mod sz) ( tail <=? n) else andb ( tail <=? n) (n <=? head).
Example test1 : filter_index 0 (slicing_ring 3 5 4) [6;9;3;4] = [4;6;9].
Так что в приведенном выше примере я ожидаю получить список результатов.Однако, если я сделаю Compute filter_index 0 (slicing_ring 2 3 4) [6;9;3;4].
, это даст мне [6;9;4]
.