线性λ演算是lambda演算的一种有限形式,其中每一个定界变量都必须精确地使用一次。例如,\a b c d e -> a b (d c) e是线性lambda演算中的一个有效项。当作为一个逻辑系统嵌入时,这将强制每个输入被精确地消耗一次。逻辑/类型/语言理论中的等价物分别称为线性逻辑、线性类型和线性语言。
有序lambda微积分是一个更有限的版本:它要求变量按照引入的顺序使用。\a b c d e -> a (b c) (d e)就是这样一个例子。
仿射和相关的lambda结石是线性lambda结石的松弛版本。
\a b c d e -> a (d c) e\a b c d -> a (c b) (d c)如果省略和复制变量都是允许的,我们就得到简单的lambda微积分。
它们与BCKW组合子微积分有着有趣的关系:
\a -> a)a b c d e -> a (B c) a c d -> B (a (B c)) d b c -> B (a (B c)) a b -> B B (B A B) a -> B (B b) (b (b B)) B (b (B B))B给定以下格式的lambda术语,将其分为五个类别中的一个(有序、线性、仿射、相关、无关联)。输出应该是输入所属的最具限制性的输出。
输入是一个lambda术语,它以一个或多个术语作为输入,并以某种方式组合它们,就像上面使用的所有示例一样。为了简化,我们可以消除输入变量的列表,只需使用变量的数量和“函数体”,其中使用的每个变量都被编码为参数列表中的索引。\a b c d e -> a b (d c) e被编码为5, "1 2 (4 3) 5"。(请注意,它不同于de索引。)
函数体可以看作是整数的字符串或嵌套结构。“变量索引”可以是基于0或1的索引,您需要处理10或更高的索引。
对于输出,您可以选择五个一致的值来表示这五个类别中的每一个。
适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。
length, "body" (lambda term it represents) => answer
1, "1" (\a -> a) => Ordered
2, "1 2" (\a b -> a b) => Ordered
2, "2 1" (\a b -> b a) => Linear
2, "1" (\a b -> a) => Affine
2, "2 (1 2)" (\a b -> b (a b)) => Relevant
2, "1 1" (\a b -> a a) => None
3, "1 3 (2 3)" (\a b c -> a c (b c)) => Relevant
4, "1 3 (2 3)" (\a b c d -> a c (b c)) => None
10, "1 (2 (3 4) 5) 6 7 8 (9 10)" => Ordered
10, "5 (2 (6 10) 1) 3 7 8 (9 4)" => Linear
10, "5 (2 (6 10) 1) (9 4)" => Affine
10, "1 5 (2 (3 6 10) 1) 3 7 8 (10 9 4)" => Relevant
10, "1 (2 (4 10) 1) 5 (9 4)" => None发布于 2021-08-04 06:47:42
a=>g=i=>i&&(h=j=>~a.flat(1/0).indexOf(i,-j),h(p=h())?5:p?i<-p:3)|g(i-1)输入嵌套整数数组(1-索引)和操作数。假设输入始终有效。输出一个数字。
发布于 2021-08-04 19:28:35
发布于 2021-08-04 21:18:53
https://codegolf.stackexchange.com/questions/233059
复制相似问题