没有合适的资源?快使用搜索试试~ 我知道了~
网址:http://www.elsevier.nl/locate/entcs/volume57.html23页准时制:战略诠释雅科·范德波尔Centrum voor Wiskunde en InformaticaAmsterdam,The Netherlands电子邮件:Jaco.van.de. cwi.nl摘要研究了一种简单的策略注释,并由此产生了一类策略,包括最左-最内策略。它表明,在一定的限制下,注释,解释器可以编写计算一个正常形式的一个术语在一个自下而上的遍历。本文的主要贡献是证明了该解释器的正确此外,提供了一个默认的策略注释,称为即时,它满足解释器的标准在许多有趣的例子中,即时策略比最内层重写有更1介绍项重写系统(TRS)是一组有向方程。一个项的求值方法是:将一个子项(方程左边的一个实例(redex))重复替换为相应的右边的实例(contractum),直到得到一个不包含redex的项(范式)。因为一个术语可以有许多redex,所以实现必须遵循一定的策略,该策略在任何时候都告诉应该选择哪个redex。一个策略通常是根据它的效率来选择的:遵循一个好的策略会导致很短的重写序列。一个聪明的策略甚至可以避免在夜间计算。对于一个真正的口译员来说,还必须考虑到发送下一份副本这就是许多系统实现最左-最内重写的原因,尽管这可能产生相对较长的还原序列,并且具有不良的终止行为[7]。我们将使用注释作为指定策略的简单方法。1.1战略注释考虑以下术语重写系统(TRS),其中if、T和F是函数符号,b、x、y是变量,并且其具有三个重写规则,c 2001年由Elsevier Science B出版。V.CC BY-NC-ND许可下的开放访问。2命名、和 ::::如果如果如果(T;(F;(b)x;x;x;y)y)x)的七!七!七!Xyx规范化项if(p; q; r)的一种自然方法是首先规范化p,然后尝试规则或 . 这个过程避免了q或r内部不必要的减少。在某些情况下,这甚至可以防止非终止计算。如果第一个参数没有归约为T或F(例如,因为p是一个开放项或因为缺少某些规则),则第二个和第三个参数必须规范化,并且最终尝试最后一个规则。 下面的策略注释可以非常简洁地表示所描述的过程:return [1]; ; ; 2; 3;]:我们说这个规则和需要第一个参数,因为它们在上面匹配。规则需要第二个和第三个参数,因为它比较了它们。我们说注释是及时的,因为if的参数在需要它们的规则被尝试之前被评估。我们说这个注释是完整的,因为if的所有参数位置和规则都出现在其中。另一个完整的、及时的注释是[1; 2; 3; ],去掉了最左边最里面的策略。我们将定义一个默认注释,它从左到右计算所有参数,并试图在计算完所需参数后我们称之为默认策略及时战略。注意,strat(if)是即时策略。1.2贡献在[18]之后,我们定义了一个归一化函数norm(t),它根据所有函数符号的策略注释对一个项进行归一化。它遍历一次项,并以自底向上的方式计算范式。如果在某个位置找到redex,则替换它并在同一位置继续搜索。因此,对于这些策略注释,nding下一个redex与最内层重写一样有效。规范化函数已被用来作为一种设计,以建立一个实际的解释器在编程语言C。将范式视为正确答案,正规化子的部分正确性意味着如果norm(t)= s,则s是t的范式。 我们称如果norm部分正确,则策略注释完成。我们的主要结果是,充分和在时间是足够的句法标准的完整性。这个结果适用于任何TRS,没有限制。这推广了[17],因为我们的限制更自由,并且该证明仅适用于左线性TRS。证明产生了一些额外的信息:尽管norm在前一个redex被发现的位置3继续,但它等价于一个特定的无记忆策略。这意味着选择的redex取决于术语4而不是之前的减少步骤。此外,norm(t)即使对于nite约简序列也遵循该策略。一个完整和及时的默认策略注释(称为即时注释)可以自动计算,并且对于许多函数定义都是令人满意的,包括if-then-else和布尔连接词合取和析取。1.3相关工作许多重写(逻辑)实现允许用户指定策略。ELAN[2]是第一个重写实现,用户可以定义自己的策略。重写规则被视为基本策略,可以由顺序组合、选择组合和条件组合构成。控制非确定性的机制也存在。在Maude[5]中,由于重写逻辑的反射原理,策略可以在逻辑内部定义。Replego[19]结合了递归策略和一般的遍历模式。这是显示[14]如何这些可以在ASF+SDF [4,3]中定义。所有提到的策略语言都远比本文研究的注释丰富。这些系统提倡计算(规则)和控制(策略)之间的分离。通过编写策略,用户可以自由选择何时应用规则重要的应用是程序转换的规范然而,这些策略并不总是完整的,在某种意义上说,一个策略可能会在一个仍然包含赎回的期限内终止。据我们所知,没有分析存在这些策略的子类是否是完整的,这是一个重要的问题,如果一个有兴趣在nding范式。OBJ家族[9,16,18]的成员具有与我们论文中讨论的相似的策略注释。在OBJ中,注释是一个整数列表。与我们类似,+i表示第i个参数的归一化。有两个不同的。 第一,不是单独提及规则(我们的、 ),OBJ使用0表示任何规则在顶层的约简 我们更精确的概念允许在应用规则时分配优先级。为了避免重复0(这将导致多次调用匹配过程),在OBJ中,前面提到的三个if规则的唯一完整和及时的注释是策略[1; 2; 3; 0],它对应于最内层的重写。第二个区别是OBJ允许i,表示参数i仅在需要时被规范化(即,如果需要与另一个规则匹配)。这样的注释指定了延迟重写,我们还没有研究过。CafeOBJ的默认策略类似于我们的即时注释。我们引用[16,p。83]:对于每个参数,在整个项之前评估参数 我们添加了:\or如果在参数的位置,出现非左线性变量”。这个附加条件是获得本文完备性结果所必需的。是5不清楚[9,16]OBJ系统是否检查用户提供的注释的完整性。在[15]和[17]中,研究了OBJ-注释的完备性。”[15]“唯”,“唯”,“唯”,“唯”,“唯”。6.1.12)以0结尾的完整注释是完整的。这是广义的[17,肺心病。3.8]通过允许最后一个0之后的参数位置。在一个单独的修正中,这些作者指出他们的证明对非左线性TRS不起作用。 此外,在[17]中,标准取决于左手边的函数符号的所有出现,而我们的标准仅取决于头部出现。因此,给定左手边g(f(c))和f(x),注释f:[0; 1]不被[17]的标准所允许,而我们的标准则允许。因此,我们推广了上述结果,有更自由的标准上的一个更大的类TRS。另一方面,[17]还考虑了按需注释的标准,我们还没有研究过。我们在文献中找到的所有归一化函数,例如[18,15,17]都有一些内存(通过标记或使用非尾递归调用)。我们的正确性证明提供了额外的信息,解释器实际上遵循一定的无记忆策略,即使在发散的情况下。在[11]中,给出了术语重写策略的调查。重点是正交系统的规范化策略。一个策略是正常化,如果它当一个范式存在时,它就给出一个范式。句法一致性是保证连贯性的句法标准。对于非正交系统,只有很少的结果规范化策略存在。我们还没有研究哪一类注释会产生规范化策略。另一方面,我们的结果也适用于非正交项重写系统。在[15]中,提供了关于急切OBJ注释的可判定标准,这些标准足以确保正交TRS的规范化策略。这些结果可能适用于我们的注释。最近,[12,13]研究了正OBJ策略和我们的策略注释的可规范性以及使用这些策略的重写系统的终止。这些问题研究的框架内的上下文敏感重写。2基本定义和结果2.1预赛我们从术语重写中获得标准定义[11,1]。我们预先假设一组变量和函数符号(f),每个变量和函数符号都期望固定数量的参数,用arity(f)表示。 项是变量(x)或应用于n项的函数symbo l f,表示为f(t1; :;tn),其中n是f的arity。我们用head(t)表示t的最上面的函数符号。位置(p,q)是一个整数字符串。我们用“来表示空字符串。我们用tjp表示t在位置p的子项,它只是良定的6证据 对于一些 ,t= l =f(l;:; l)。因为l不需要i,li是j 6= i),所以l = l,且l = s。 因此l = t[s]。2如果p是t中的一个位置(形式定义见[1])。在这种情况下,tj“= t并且f(t1; :;tn)j i:p=ti j p。 用t[s]pwe表示t项,其中t j p由ys代替。 我们写pq,如果p是q的前x(即,p:p0 =q对于某个p0)。重写规则是一对项l7!r,其中l不是变量,所有在r中出现的变量也在l中出现。术语重写系统(TRS)是一组重写规则。替换是从变量到项的映射,我们用t表示所有变量x都被(x)替换的项t。TRSR在项上归纳重写关系如下:Rt[r]p当且仅当对于某个规则l7,tj p = l!r2河在这种情况下,l被称为redex,r被称为contractum,而对(l; r)在[11]中被称为重写。正规形式是不包含redex的项t。请注意,redex在同一项中可能会出现多次,因此为了唯一地识别重写步骤,我们还需要位置p。由于这个原因,方便的做法是称对(p; r)为t的重写。2.2战略注释和战略TRS R中函数符号f的策略注释是一个列表,其元素可以是:a number i,1我arity(f);或第十七条规则!r 2 R,使得head(l)=f。在不失一般性的情况下,我们将假设注释没有重复,即每个i最多出现一次(在第一次规范化之后,第i个参数是正常的,因此第二次出现的i将不会贡献实际的重写步骤)。我们为空注释写[],为头为x尾为L的注释写[xjL]。在续集中,i; j; k将在argu- ment位置上变化,并且;;重写规则。所以[ijL]以一个自然数开始,[jL]以一个重写规则开始。如果li不是一个变量,或者如果它是一个出现在l j中的变量,对于某个j6= i,则对于左边的f(l 1 ;:; l n),索引i是n e d的。l7规则需要索引ir如果l需要i。一 个策略注解L对于f是满的,如果对于每一个i具有1 i元(f),i2L并且对于每一个规则:l 7!r2R,其中head(l)=f,2 L。一个策略注释L是及时的,如果对于任意和i使得L=L1L2iL3,i是不需要的。 在一个完整的和及时的注释中,所有需要的位置都发生在之前。“需要”这一概念的特点如下:引理2.1L设l=f(l1; :;ln),且设对l,i不成立。如果t= l,则对于任何s,t[s]i= l。1N一个变量 让= [li:= s]. 因为i是不需要的,所以li不会出现在lj中(因为jj i ii7我们现在定义与策略注释相关联的策略一个策略可以被看作是一个部分函数,给定一个项t,产生t的一些重写,即一个对(q; s),使得tj q = l和s = r对于一些规则l 7!R和替换。 在这种情况下,T!Rt[s]q. 或者,函数可以产生?(under ned {found no rewrite). 一个完整的战略收益率?在t上,仅当t这是一个正常的形式。在续集中,一个固定的TRS R假设,与一个固定的战略注释策略。我们把strat(t)写成strat(head(t))的缩写,即其头符号的策略注释,其中变量x的strat(x)=[]。 我们说,如果strat(f)对于所有符号f都是满的(在时间上),那么strat(f)就是满的(在时间上)。接下来我们去-ne_rewr1(t;L),其根据注释计算t中的下一个重写L. 在L=st rat(t)的情况下,我们都像在rewr 1(t)中一 样 轻 微 地 过 载 。 定 义 2.2rewr1 ( t ) =r ewr1 ( t;strat(t)),其中:r ewr 1(t;[])=?8>r ewr 1(t;[l7!(rjL])=>:8rewr1(t;[i jL])=>><>:如果t = l,则(“;r)elserewr1(t;L)如果rewr1(tji)=(q;s),对于某些q,s,则(i:q; s)elserewr1(t;L)通过对t的归纳和对L的策略注释来进行定义。 在每个递归调用中,要么t项变小,要么它保持相等而列表L变小。 因此,该函数终止于(q;s)或?. 我们现在展示了对于完整的注释,相关的策略是完整的:命题2.3如果st rat是full且rewr1(t)=?,则t是正规形式证据证明是用t上的归纳法。假设t不是标准形式。然后它包含一个redex,要么在顶层,要么在适当的子项中。我们区分这两种情况:假设对于某个规则t = l:l 7!R.然后,通过对L的归纳,可以表明:“如果2L,则定义rewr 1(t;L)”。 通过充满性,2st rat(t),因此定义了r ewr 1(t)=r ewr 1(t;st rat(t))。假设tj i包含一个redex。 然后使用归纳假设,可以用L上的归纳来表><8示 :“如果i2L,则定义rewr 1(t;L) ”。 通过充满性,i2st rat(t),因此定义了r ewr 1(t)=r ewr 1(t;st rat(t))。2[1]这只包括确定性的、一步式的、无记忆策略。92.3问题陈述给定一个策略注释,相关的约简序列可以定义如下:8seq1(t):>个如果rewr1(t)=(q;s)对于某个q,s,则t::seq 1(t[s]q)埃尔什蒂由上述命题,可得到一个标准形为last(seq1(t))(对于有限序列,这是未知的).计算的缺点是,在每一步之后,必须遍历整个项t[s]q以进行下一次重写。这重复了上一步的大量工作。如果能在位置q继续搜索就好了。因此,我们提出了下面的部分函数,norm(t; L),它试图根据注释L找到t的标准形式。我们允许轻微的重载,如norm(t),如果L是固定策略注释策略。我们将此函数视为解释器的设计。定义2.4norm(t)= norm(t; strat(t)),其中:norm(t; [])= t8norm(t; [l 7!rjL])=:>个如果t = l,则norm(r)elsenorm(t; L)norm(t; [ijL])= norm(t[norm(tji)]i; L)为 了 避 免 位 置 符 号 , 最 后 一 个 子 句 也 可 以 写 成 nor m ( f(t1; :;ti; :;tn);[i j L])=nor m(f(t1; :;nor m(ti); :;tn);L)。如果t是非终止项,则norm(t)可能发散,在这种情况下,它是under ned。 第二部分是本文的技术核心,即规范的正确性。也就是说,我们必须证明定理2.5如果strat是在时间上的,则norm(t)= last(seq 1(t))。这直接从命题3.1和3.7得出。结合命题2.3,我们得到了对于完全策略和及时策略,如果norm(t)= s,则s是正规形。2.4反例它可以说明为什么需要注释上的条件。考虑一下这个系统,它有三个来自引言的if规则,还有一个附加的规则T^ T 7!T.>>>><10strategy-annotation [;; 1; 2; 3;]不是及时的,因为匹配rst参数。考虑项if(T^T; x; y)。统治与不11立即适用。T^ T减少后,将不再尝试。所以在这个注释下,norm(if(T^ T;x; y))= if(T; x; y),这不是正态的。 类似地,[1; ; [2]不及时,因为在第二和第三个参数中是非线性的。 在此注释下,norm(if(x; T ^T;T))= if(x; T; T)。这是不正常的,因为这是过早尝试。最后,[;; 2; 3; ]不是满的,因为参数位置1丢失了。在这种注释下,范数(if(T^ T; x;y))= if(T^ T; x; y),这不是正态的。这些例子表明,这些条件一般是不能放弃的。 在某些情况下,它们可以被削弱。例如:f(x)7!g(x),注释[ ]不是完整的,但这是无害的,因为适用于任何带有头部符号f的术语。这种弱化是不必要的,因为解释器的行为与完全策略完全相同[;1]。3正确性证明证明有两个不同的部分。首先,我们确定了一系列的赎回权的标准。由于它的双重递归定义,这并不简单。 通过程序转换,我们找到了一个等价的函数,也没有m2,其中消除了双重递归,有利于包含返回点的堆栈。根据这个定义,可以很容易地提取出一系列的赎回(3.1节)。乍一看,norm并不遵循无记忆策略,因为在位置q处发送redex,其从q向前继续其搜索。因此,找到的重写依赖于某个内部“状态”或“内存”,比如S。因此,该策略将是形式rewr 2(t;S)=(q;s;R)的函数,其中(q; s)是找到的重写,并且R表示下一个状态。在续集中,三元组(q; s; R)也将被称为重写。证明的第二步(3.2节)表明,如果注释是及时的,则状态不影响找到的重写。也就是说,下一个重写可以在 两 个 等 式 中 找到:rewr 2(t[s]q;S)= rewr 2(t[s]q;R)。然后,通过观察到对于初始状态I,r ewr2(t;I)=r ewr 1(t)来完成证明。3.1使递归显式化这一节消除了双重递归。在第一次变换中,我们用位置递归代替子项递归。这使得有可能返回到前一阶段。首先说明:norm 1(t;p;L)=t[norm(tjp;L)]p128>如果tjp=l,接下来,使用这个定义和范数的定义方程,我们可以计算(第A.1节)范数m1的以下递归定义:norm 1(t;p;[])=t8或m 1(t;p;[l7!(rjL])=>:如果对于某些则norm1(t[r]p;p;strat(r))elsenorm1(t;p;L)非m 1(t;p;[ijL])=非m 1(非m 1(t;p:i;strat(t jp:i));p;L)接下来,我们消除了双重递归以支持堆栈,堆栈是先前位置和仍然必须执行的注释对的列表。为此,我们引入了norm2的递归函数:norm 2(t;[])=tnorm 2(t;[(p;L)jS])=norm 2(norm 1(t;p;L);S)根据这一点,以及针对norm 1导出的递归方程,我们可以导出(第A.2节)针对norm2的以下递归方程:norm 2(t;[])=tnorm 2(t;[(p;[])jS])=norm 2(t;S)也不能将m 2(t;[(p;[l7!(rjL])jS])=>>>:则norm2(t[r]p;[(p;strat(r))jS])elsenorm2(t;[(p;L)jS])norm 2(t;[(p;[ijL]) jS])=norm 2(t;[(p:i;strat(t jp:i));(p;L) jS])从这个明确的定义,很容易猜测下一个重写规范2将采取,给定当前状态(堆栈)S。这就产生了下面的定义rewr 2(t;S)。 结果也会是这样吗?或三元组(q;s;T),其中(q; s)表示如前所述的重写,并且T是替换t[s] q之后的栈。r ewr 2(t;[])=?rewr2(t;[(p;[]) jS])=r ewr2(t;S)8r ewr 2(t;[(p;[l7!rjL])jS])=:>个>>><>>><13如果对于某些then(p; r; [(p; strat(r))jS])elserewr2(t;[(p;L) jS])rewr2(t;[(p;[i jL]) jS])=r ewr2(t;[(p:i;strat(t jp:i));(p;L) jS])通过该函数rewr 2,我们可以定义第二重写序列。这一次序列不是无内存的,因为每一步都会改变状态14(堆叠S)的系统。 8>如果对于某个q,s,R,rewr2(t;S)=(q;s;R),seq 2(t;S)=><>:thent::seq 2(t[s]q;R)elsehti为了证明rewr2(t;S)确实产生下一次重写, 在状态S中,可以进行分离,或m3(t;S)=lastt(seq2(t;S))利用seq2和rewr 2的定义,可以导出nor m3的递归方程(A.3节),它与nor m 2的递归方程完全相同。我们总结本节的结果:命题3.1也不是m(t;st rat(t))=last(s eq2(t;[(“;st rat(t))]))。是的。首先,nor m1(t;p;L)=nor m2(nor m1(t;p;L);[])=nor m2(t;[(p;L)])。此外,nor m(t;L)=t[nor m(t j“;L)]“=nor m 1(t;“;L)。 其结果是由前面的注释或m2(t;S)=lastt(seq2(t;S))引起的.23.2连接无记忆和基于状态的策略不需要证明seq 2(t;[(“;st ra t(t))])=seq1(t)。如果对于所有可读取状态S,r ewr 2(t;S)产生与r ewr 1(t)相同的重写,则情况就是这样。为此,我们首先证明堆栈将始终是格式良好的(de-formed)。nedbel ow)。然后我们展示,事实上,实际上是当前状态的指数,即对于所遇到的所有stak S,rewr 2(t;S)= rewr 2(t;[(“;st rat(t))])(引理3.5)。最后,我们示出了r ewr 2(t;[(“;st ra t(t))])=r ewr 1(t)(引理3.6)。我们现在定义一组格式良好的堆栈。t.直观地说,栈中的位置在t中形成适当的路径,栈上的所有注释都是及时的,并且节点最多可以被访问一次。定义3.2w.r.t.t归纳定义如下:[]格式良好。[(“; L)]是良构的,如果L是head(t)的即时策略注释。[(p:i; K);(p; L)jS]是良构的,如果[(p; L)jS]是良构的,并且p:i是t中的位置,K是head(tj p:i)和i 62 L的及时策略注释。引理3.3如果strat在时间上,则它是rewr2(norm) 2和s eq 2),该堆叠是W l l形式的ed。证据[(“; strat(t))]是格式良好的(初始条件),并且该属性在所有递归调用中都是保留的。这依赖于策略符号不包含重复的假设215p找到一Redex引理3.4.3引理3.4.2Q引理3.4.1在tp找到一Redex在St[s]qQ图1.一、 密封圈不能在t[s]q中密封。下面的技术引理是证明的核心。它表明,如果从状态S到t的搜索产生重写(q; s; R),那么从S到t的搜索可以在t[s] q中模仿,并将再次导致状态R(见图1)。证明的关键是,如果规则在tjp处不适用,则在tjp只能出现在一个不需要的参数中,所以在t[s]q中, jp规则也不适用。 引理3.4{3.7}的完整证明在附录B中。引理3.4设strat是在时间上的。设[(p; L)jS]为格式良好的堆栈。对于某些q,s和R,As-ε wr 2(t;[(p;L)j S])=(q;s;R)。然后我们有:(i) 如果q6p,则r ewr 2(t;[(p;L)j S])=r ewr 2(t;S)。(ii) 如果p = q,则R = [(p; strat(s))jS]。(iii) 如果q6p,则r ewr 2(t[s]q;[(p;L)j S])=r ewr 2(t[s]q;R)。素描证明。(i) 对tjp的结构进行了归纳,并对等tjp的 L的结构进行了归纳.证明是在L上通过区分格来(ii) 在L=[i j L0]的情况下使用(i)对L进行归纳。(iii) 从stack[(p;L)jS]和项t开始,在许多步骤中减少到(q; s; R)。证明通过模仿这种从t[s]q项中的相同堆栈开始的归约来进行。证明是通过对rewr2(t;[(p;L)j S])到(q;s;R)的递归调用的次数的归纳.216引理3.5Letst ratbein-time. 如果r ewr 2(t;[(“;st ra t(t))])=(q;s;R),则r ewr 2(t[s]q;R)=r ewr 2(t[s]q;[(“;st ra t(t[s]q)])。素描证明。如果q =“,则由引理3.4得出。(二). 否则,q >“,结果由引理3.4得出。(三).217最后,我们讨论了reewr1与 和r ewr 2:引理3.6(i) 对于某些R,rewr1(t)=(q;s)(),r ewr2(t;[(“;strat(t))])=(q;s;R)(ii)r ewr 1(t)=? ()r ewr 2(t;[(“;st rat(t))])=?素描证明。这个证明可以从下面的命题中得出,这些命题可以通过对tjp的结构的同时归纳来证明,并且对于相等的tjp,可以通过对L的同时归纳来证明。(i) 如果r ewr 1(t j p;L)=(q;s),则对于某个R,r ewr 2(t;[(p;L)j S])=(p:q;s;R)。(ii) 如果rewr1(tj p;L)=?,则r ewr2(t;[(p;L)j S])=r ewr2(t;S)。2命题3.7如果st rat是及时的,则s eq 2(t;[(“;st rat(t))])=s eq 1(t)。s ket ch 的 proo 。 使 用 引 理 3.5 和 3.6 , 可以将 seq2 ( t;[ ( “;st ra t(t))])的定义变换为seq1(t)的定义。24实现及应用我们已经构建了一个C-实现的功能规范,它作为一个给定的TRS注释的一些策略的解释器。 默认情况下,系统在初始化期间计算即时策略。我们首先描述这个注释,然后提到一些实现问题。4.1准时制战略诠释准时制战略的定义如下。对于任何函数符号f,其元数为n,取列表[1;:;n]。 接下来,将每个规则直接插入到它需要的最后一个参数位置之后(由于匹配或非线性)。如果在i和i + 1之间放置了几个规则,则保持原始规范的文本顺序。我们将此策略应用于几个具体的问题,取得了令人满意的结果。应用领域是分布式系统的验证,其中系统规范具有过程部分和代数数据规范部分。正在实现一个定理证明器,通过BDD和项重写的组合,沿着[10]的路线解决代数数据规范上的等式的布尔组合。在许多情况下,最内层的重写并没有导致范式。下面我们列出一些规则,以说明18这一点::F _x 7!X:T _ x 7!不: count(l)7! if(empty(l); 0; 1+ count(tail(l):div(m; n)7! if(m n; 0; 1+ div(mn; n)):rem(m; n)7!如果(m n; m; rem(mn; n))在封闭列表上,count以即时注释[;1]结束(作为empty和tail的标准定义),但它与最内层重写不同。这可以通过模式匹配替换if来解决,为count([])和count([xjL])提供规则。然而,这种解决方案不容易用于div和rem(除法和余数)。假设和的标准定义,这些函数终止于正n的闭数m和n,具有即时注释[n =; 1; 2],但它们在最内层重写时发散。_的即时注释为[1; ; ; 2]。 使用此注释,eq(n; 0)_div(m; n)
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功