在Isabelle中将多项式mod的系数作为int列表

时间:2014-11-16 22:39:25

标签: isabelle

我试图得到两个多项式除法余数的int list个系数。我一直在尝试使用mod Polynomial.thyint poly类型的两个多项式进行处理。但是,我收到了错误:

Type unification failed: No type arity int :: field

我的功能是:

fun testFunc :: "int poly ⇒ int poly ⇒ int list"
where
  "testFunc p q = int_list (coeffs (p mod q))"

int_list只需通过对每个元素进行拼接,将一个实数列表转换为一个整数列表:

fun int_list :: "real list ⇒ int list"
where
  "int_list [] = []" |
  "int_list lst = [floor (hd lst)] @ int_list (tl lst)"

当我将我的函数定义为:

时,这是有效的
fun testFunc :: "'a::field poly ⇒ 'a poly ⇒ int list"
where
  "testFunc p q = int_list (coeffs (p mod q))"

但是,传递给函数的两个参数特别是类型int poly。如果我使用第二个定义传入两个多项式'a::field poly'a poly,则返回'a list,我无法运行我的int_list函数。

如果我将int_list的签名更改为'a list => int list,那么我必须对每个元素使用int_of,这最终不会评估列表中的整数。 (即我得到类似[int_of 2, int_of 3]而非[2, 3]的内容,当我尝试对这些列表执行某些操作时,会使用int_of x表达式返回,而不是评估)

是否有可能得到两个多项式模数的int list个系数?

1 个答案:

答案 0 :(得分:1)

floor函数需要一个已被实例化为类floor_ceilingArchimedean_Field.thy#l140)的类型。

所以,我使用int_list

使'a::floor_ceiling尽可能通用
fun int_list :: "'a::{floor_ceiling} list => int list" where
  "int_list [] = []" |
  "int_list lst = [floor (hd lst)] @ int_list (tl lst)"

已为类poly实例化了ring_div类型,它为mod函数提供了'a::field函数,但仅适用于testFuncPolynomial.thy#l1467)。

由于int_list使用testFunc,我使用'a::{field,floor_ceiling}使fun testFunc :: "'a::{field,floor_ceiling} poly => 'a poly => int list" where "testFunc p q = int_list (coeffs (p mod q))" value "testFunc ([:1,2,3:]::real poly) ([:5,6,7:]::real poly)" (*OUTPUT: "[- (2::int), - (1::int)]" :: "int list" *) 尽可能一般:

declare[[show_sorts, show_consts]]
print_classes 
  (*At 'class ring_div', it shows ' poly :: (field) ring_div'.*)  
print_dependencies floor_ceiling  
print_dependencies ring_div

一些信息命令:

{{1}}