Questions tagged «lambda-calculus»

13
为无类型的lambda演算编写解释器
面临的挑战是为无类型lambda演算编写尽可能少的字符的解释器。我们将无类型的lambda演算定义如下: 句法 有以下三种表达式: Lambda表达式的形式为(λ x. e),其中x可以是任何合法变量名和e任何合法表达式。这里x称为参数,e称为函数体。 为简单起见,我们添加了进一步的限制,即不得存在与x当前作用域同名的变量。当变量的名称出现在(λ和之间时,变量就开始在范围.内,而在对应的变量处就停止在范围内)。 功能应用程序具有形式和形式(f a),它们是合法的表达式。这里称为函数,称为参数。fafa 变量的格式为xwhere x是合法变量名。 语义学 通过将函数体内参数的每次出现替换为其自变量来应用函数。更正式的形式的表达((λ x. e) a),其中x是变量名和e和a是表达式,评估(或减少)至表达式e',其中e'是取代的每次出现的结果x在e与a。 范式是无法进一步评估的表达式。 挑战 您的任务(如果您选择接受它)是编写一个解释器,该解释器将不包含自由变量的未类型化lambda演算的表达式作为输入,并产生该表达式的标准形式(或与该表达式一致的表达式)作为其输出。 。如果该表达式没有范式或它不是有效的表达式,则该行为是不确定的。 字符数最少的解决方案获胜。 一些注意事项: 输入既可以从stdin读取,也可以从作为命令行参数给出的文件名读取(您只需要实现一个或另一个即可-无需同时实现)。输出进入标准输出。 或者,您可以定义一个函数,该函数将输入作为字符串,然后将输出作为字符串返回。 如果非ASCII字符对您有问题,则可以使用反斜杠(\)字符代替λ。 我们计算字符数,而不是字节数,因此,即使您的源文件被编码为unicodeλ也算为一个字符。 合法变量名称由一个或多个小写字母组成,即a和z之间的字符(无需支持字母数字名称,大写字母或非拉丁字母-尽管这样做当然不会使您的解决方案无效)。 就此挑战而言,没有括号是可选的。每个lambda表达式和每个函数应用程序都将恰好由一对括号包围。变量名不会用括号括起来。 语法糖就像写(λ x y. e)的(λ x. (λ y. e))并不需要得到支持。 如果评估函数的递归深度大于100,则行为不确定。该值应该足够低,以至于无需在所有语言中进行优化即可实现,而且还应足够大以能够执行大多数表达式。 您可能还假定间距将与示例中的相同,即在输入的开头和结尾或a λ或之前没有空格,而在a .和之后.以及函数与其参数之间以及a 之后恰好有一个空格λ。 样本输入和输出 输入: ((λ x. x) (λ y. (λ z. …

22
递归字符串替换
任务 编写一个程序或函数,给出给定的三个字符串A, B, C会生成一个输出字符串,其中Bin的每个实例A都已用递归替换C。递归替换表示重复替换,其中在每一步中Bin的所有不重叠实例A(从左到右贪婪地选择)都替换为,C直到B不再包含在中A。 输入输出 您可以对I / O使用任何默认方法。 字符串将仅包含可打印的ASCII字符(并且可以包含任何一个)。 B永远不会是一个空字符串,而A并且C可能是。 字符串应被视为纯文本,例如,您不能将其B视为Regex模式。 输入的某些组合永远不会终止。在这种情况下,您的程序可以执行任何操作。 测试用例 这些格式为: A/B/C\nOutput Hello, world!/world!/PPCG Hello, PPCG Uppercase is up/up/down Uppercase is down ababababa/aba/ccc cccbcccba delete/e/{empty string} dlt {empty string}/no/effect {empty string} llllrrrr/lr/rl rrrrllll +-+-+-+/+-+/+ + ababababa/aba/bada badabbadbada abaaba/aba/ab abb ((())())())/()/{empty string} ) 不会终止的示例: grow/ow/oow loop/lo/lo
25 code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

4
优化SKI编译器
该SKI演算是不使用Lambda表达式lambda演算的变体。相反,只有应用程序和组合器S,K,和我使用。在此挑战中,您的任务是将SKI术语转换为β范式的 Lambda术语。 输入规格 输入是以下文本表示形式的SKI术语。您可以选择接收可选的尾随换行符。输入是由字符S,K,I,(,和)与满足以下语法(在ABNF形式)sterm作为起始符号: sterm = sterm combinator ; application sterm = combinator ; sterm = '(' sterm ')' ; grouping combinator = 'S' | 'K' | 'I' ; primitives 输出规格 输出是以下文本表示中没有自由变量的lambda术语。您可以选择输出可选的尾随换行符。输出应满足以下ABNF格式的语法:lterm并以开始符号表示: lterm = lterm operand ; application lterm = ALPHA '.' lterm ; lambda lterm = operand operand = …

1
将λ表达式转换为SK表达式
所述λ演算,或演算,是根据匿名功能的逻辑系统。例如,这是一个λ表达式: λf.(λx.xx)(λx.f(xx)) 但是,出于此挑战的目的,我们将简化表示法: 更改λ为\(以便于键入):\f.(\x.xx)(\x.f(xx)) 该.拉姆达头是不必要的,所以我们可以删除它:\f(\xxx)(\xf(xx)) 在应用程序中使用Unlambda样式的前缀表示法,`而不是将两个函数一起编写(有关如何执行此操作的完整说明,请参见在Lambda微积分表示法之间转换):\f`\x`xx\x`f`xx 这是最复杂的替换。根据变量相对于其所属的lambda标头的嵌套深度(即,使用基于0的De Bruijn索引),用括号中的数字替换每个变量。例如,在\xx(身份函数)中,x主体中的in将替换为[0],因为它属于在将表达式从变量遍历到末尾时遇到的第一个(从0开始)头。\x\y``\x`xxxy将被转换为\x\y``\x`[0][0][1][0]。现在,我们可以将变量放在标头中,离开\\``\`[0][0][1][0]。 组合逻辑基本上是由λ微积分构成的Turing Tarpit(嗯,实际上,它是第一位的,但是在这里无关紧要。) “组合逻辑可以看作是lambda演算的一种变体,其中lambda表达式(代表功能抽象)被有限的组合器集合所取代,这些组合器不存在绑定变量。1个 组合逻辑最常见的类型是SK组合器演算,它使用以下原语: K = λx.λy.x S = λx.λy.λz.xz(yz) 有时I = λx.x会添加一个组合器,但它是多余的,因为SKK(或实际上SKx对任何而言x)都等同于I。 您只需要K,S和应用程序即可编码λ微积分中的任何表达式。例如,这是从函数λf.(λx.xx)(λx.f(xx))到组合逻辑的转换: λf.(λx.xx)(λx.f(xx)) = S(K(λx.xx))(λf.λx.f(xx)) λx.f(xx) = S(Kf)(S(SKK)(SKK)) λf.λx.f(xx) = λf.S(Kf)(S(SKK)(SKK)) λf.S(Sf)(S(SKK)(SKK)) = S(λf.S(Sf))(K(S(SKK)(SKK))) λf.S(Sf) = S(KS)S λf.λx.f(xx) = S(S(KS)S)(K(S(SKK)(SKK))) λx.xx = S(SKK)(SKK) λf.(λx.xx)(λx.f(xx)) = S(K(S(SKK)(SKK)))(S(S(KS)S)(K(S(SKK)(SKK)))) 由于我们使用的是前缀表示法,因此为```S`K``S``SKK``SKK``S``S`KSS`K``SKK`。 1资料来源:维基百科 挑战 到目前为止,您可能已经猜到了什么:编写一个程序,该程序将有效的λ表达式(以上述符号表示)作为输入和输出(或返回)相同的函数,并用SK组合器演算重写。注意,有无数种方法可以重写它。您只需要输出无限方式之一。 …

8
反向插入排序
目的 根据“ 插入排序”对列表进行排序的动作,生成原始的加扰列表。原始列表将包含从0到N-1(包括)的所有数字,其中N输入的大小。 输入项 一个包含对列表进行排序的必要动作的列表。每个值代表由原始数字(加扰的数字)移位到其右位置的插槽数量,请记住,此过程是从左到右。输入列表 中(0索引)位置的值i将介于0和之间i。 您不需要处理无效的输入,在这种情况下,任何行为都是可以接受的(崩溃,无限循环等)。 输出量 混乱的名单 逐步生成动作 Scrambled List | Moves to sort [4,0,2,1,3,5] | [0, , , , , ] #4 stay in place [4,0,2,1,3,5] | [0,1, , , , ] #0 is moved 1 slot to the left [0,4,2,1,3,5] | [0,1,1, , , ] #2 …
19 code-golf  array-manipulation  code-golf  code-golf  animation  code-golf  restricted-source  code-golf  java  code-golf  decision-problem  graph-theory  code-golf  conversion  electrical-engineering  code-golf  ascii-art  code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

4
可视化教堂数字
背景 可视化λ微积分项 著名的lambda-juggler(和代码高尔夫球手)John Tromp设计了一个有趣的可视化 λ微积分项。用他的话说: 抽象(lambda)由水平线表示,变量由从其绑定lambda向下发出的垂直线表示,应用程序由连接最左侧变量的水平链接表示。 例如,λ项λf.λx.f(f(f(fx)))对应于可视化: ------------------- | | | | ------------------- | | | | | | | | |---- | | |---- | |---- |---- | 从上到下阅读: 第一水平线代表第一λ。 从它开始的四行代表体内的f s。 类似地,第二条水平线代表第二条λ,从其下降的一条新线代表体内的x。 最右边的f线和x线由代表应用程序(f x)的水平线连接。 下一个应用是[f(f x))等。 教堂数字 在Church数是在λ演算项的特定序列,考虑以下图案: 0 = λf. λx. x 1 = λf. λx. f …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.