2016-08-16 7 views
1

Я пытаюсь определить функцию Sum f k, суммирующий f от 0 до к-1, такие, чтоОшибка: «Non-конструктор шаблон не допускается в последовательном режиме» (Isabelle)

Sum f k = f 0 + ⋯ + f (k - 1). 

Я определил его следующим образом:

fun Sum :: "(nat => nat) => nat => nat" where 
    "Sum f 1 = f 0" 
| "Sum f k = f (k-1) + Sum f (k-1)" 

Однако это дает следующее сообщение об ошибке:

Malformed definition: 
Non-constructor pattern not allowed in sequential mode. 
⋀f. Sum f 1 = f 0 

Это сообщение об ошибке исчезает, когда я определяю Sum f 0 = f 0, но это не функция, которую я пытаюсь определить. Я также могу использовать function и дать доказательства устойчивости, но я был бы очень удивлен, если бы это было необходимо

Может ли кто-нибудь объяснить сообщение об ошибке и порекомендовать обходное решение/исправление?

ответ

2

Вы можете использовать конструкторы только в шаблонных совпадениях. Конструкторы nat: 0 и Suc. Поэтому, если вы напишете 1 как (Suc 0), он должен работать.

+0

Спасибо, я последовал твоему совету, но теперь у него есть «незавершенные подцели». Я ожидаю, что это означает, что мне нужно использовать 'function' вместо этого, хотя я бы предпочел не делать этого. – IIM

+0

Хорошо, я попробовал 'fun Sum ::" (nat => nat) => nat => nat "где " Sum f 0 = 0 " | «Сумма f (Suc k) = f k + Sum f k", и это, казалось, сработало! Я предполагаю, что он должен быть «Сук» повсюду (и теперь «базовый случай» имеет больше смысла). – IIM

+0

У вас есть незавершенные подцели, потому что ваше исходное определение не завершилось: 'Sum f 0 = f (0-1) + Sum f (0-1) = f 0 + Sum f 0 = ...'. Добавив случай для 0, исправьте это. – peq

 Смежные вопросы

  • Нет связанных вопросов^_^