我正在Idris中进行一些开发,并且遇到了以下问题。假设我们有3个向量:
xs : Vect len a
ys : Vect len a
zs : Vect len' a
说我们也有
samelen : len = len'
最后,我们还具有以下相等性:
xsys : xs = ys
yszs : ys = zs
在第一个等式中,我们对类型 Vect len a 具有相等性,而在第二个等式中,对 Vect len'a 具有相等性。现在我们要建立:
xsza : xs = zs
我一直很难完成这项工作。特别是,trans需要相同类型之间的相等性,但事实并非如此。在这里如何使用可传递性来实现xsza?
答案 0 :(得分:3)
为什么确定?
package javadatabase;
import java.sql.*;
public class JavaDatabase {
public static void main(String[] args) {
try
{
Class.forName("Net.ucanaccess.jdbc.UcanaccessDriver");
Connection con = DriverManager.getConnection("jdbc:ucanaccess://JavaDatabase.accdb");
Statement st = con.createStatement();
String rol = "ADSADADS";
String name = "Laere";
String contact = "019209010";
String marks = "65";
String query = "Insert INTO Table2(Roll , Name, contact, Marks) "
+ " Values('"+rol+"' , '"+name+"' , '"+contact+"' , '"+marks+"')";
st = con.createStatement();
st.executeUpdate(query);
System.out.println("Successful");
}
catch(Exception ex)
{
System.out.println("ERROR: " + ex.getMessage());
}
}
}
我认为重要的是要知道这基本上是一个函数。您不能使用xszs : {A : Type} -> {len, len' : Nat} ->
(xs, ys : Vect len A) -> (zs : Vect len' A) ->
len = len' ->
xs = ys -> ys = zs ->
xs = zs
xszs {A} {len} {len'=len} xs ys zs Refl = trans
证明在已经存在的事物类型中将sameLen
替换为len
。也就是说,如果您的类型签名都是顶级的,那么Idris永远不会说服len'
。您必须使用辅助功能。在上述函数中,在引入zs : Vect len a
变量之前,将len'
与len
进行匹配,并通过匹配Refl
来证明其正确性。您可能会认为这显然是错误的,因为zs
在zs
参数之前,但是,由于Idris是一门完整的语言,因此允许编译器通过隐式重新排列抽象和匹配来简化您的工作还有所有爵士乐。实际上,在Refl
被匹配之前,Refl
被引入之前,目标类型为zs
,但是匹配将其重写为(zs : Vect len' A) -> xs = ys -> ys = zs -> xs = zs
和{{1} }引入了更好的类型。
请注意,(zs : Vect len A) -> ?etc
确实不是必需的。这有效:
zs
甚至
len = len'