Как сделать раздел списка в coq - PullRequest
0 голосов
/ 23 октября 2019

У меня есть список натуральных чисел, и я хочу разделить его на три списка с соотношением 3: 2: 1. Хотите использовать функцию разбиения. Пожалуйста, укажите мне

Fixpoint section (l: список A): список A * список A: = соответствует l с |ноль => (ноль, ноль) |x :: tl => let (g, d): = раздел tl, если fx, то (x :: g, d) else (g, x :: d) end.

1 Ответ

1 голос
/ 24 октября 2019

Ваша проблема не указана, но вот пара указателей:


Во-первых, ваша функция, вероятно, будет отличаться от partition, потому что partition предполагает существование функции, которая, учитываяодин элемент из списка, знает, к какой части раздела он принадлежит.

Однако, учитывая вашу свободную спецификацию, кажется, что элементы должны принадлежать одному из трех разделов не на основе их собственного значения, а скореео каком-либо свойстве списка, в котором они появляются, и о количестве других элементов.


Вот один из способов решения этой проблемы: отсутствие внешних ограничений на распределение значений в разделахВы можете получить соотношение 3: 2: 1, разделив список на 6 равных разделов, а затем объединив вместе 3 раздела и раздельно 2 раздела.

Теперь проблема заключается в том, чтобы создать функцию для созданияn разделов. В зависимости от вашего уровня квалификации и того, нужно ли вам писать доказательства о функции, могут быть разные способы сделать это.

Написание фактической функции, которая возвращает n списков для любого *Для 1017 * потребуется зависимый тип с некоторым n -арным типом продукта. Вы можете подделать его, имея функцию:

get_partitions : list T -> (n : nat) -> (i : nat) -> list T

, так что get_partitions l n i фильтрует элементы l по индексам i, i + n, i + 2n и т. Д. (Т.е. элементы, чьиindex равен i mod n).

Тогда вы можете получить свои шесть разделов как get_partitions l 6 0, get_partitions l 6 1, ..., get_partitions l 6 5.

Thisбыло бы легко написать решение, но не может быть лучше для целей доказывания ... У кого-то могут быть лучшие идеи. : -)

...