2013-03-09 2 views
1

Я хочу создать определение, имеющее кортеж в качестве аргумента.Использование кортежей в определениях

definition my_def :: "('a × 'a) ⇒ bool" where 
    "my_def (a, b) ⟷ a = b" 

Однако, это не принято. Сообщение об ошибке

Bad arguments on lhs: "(a, b)" 
The error(s) above occurred in definition: 
"my_def (a, b) ≡ a = b" 

Использование fun вместо definition работает, но это не то, что я хочу. Следующие обозначения также работает, но несколько некрасиво:

definition my_def :: "('a × 'a) ⇒ bool" where 
    "my_def t ⟷ fst t = snd t" 

Каков наилучший способ использовать кортежи в качестве аргументов в definition?

+0

Так что случилось с 'fun' здесь? 'fun' и' definition' равны в механизмах определения * производных *, тогда как 'definition' просто оказывается более минималистичным (и позволяет определять вещи без аргументов). – Makarius

+0

'fun' автоматически распространяется на его определение. – corny

+4

ОК, это определенная разница по умолчанию. Вы можете сказать 'declare my_def.simps [simp del]' после 'fun' или использовать' definition' с абстракцией кортежа, как предложено lsf37. – Makarius

ответ

2

Использование fun, вероятно, является наименее болезненным способом для этого, пакет определения не распознает шаблоны с левой стороны.

Другой вариант заключается в использовании шаблонов кортежей для лямбда-выражений: my_def ≡ %(a,b). a = b

+1

Обратите внимание, что 'my_def (a, b) = ...' и 'my_def tup =% (a, b). ... "отличаются при использовании с упростителем. Первое определение расширяется только в том случае, если аргумент уже разделен. Это иногда полезно, а иногда и нет;) –

+0

Просто указывая, возможно, путаную опечатку в комментарии выше: 'my_def tup =% (a, b). ... 'следует заменить на' my_def =% (a, b). ... '. –

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