如何调用无法循环的结构化语言或无法返回的函数式语言

时间:2011-02-01 02:51:08

标签: theory language-theory automata-theory

我创建了一种特殊用途的“编程语言”,故意(按设计)不能两次评估同一段代码(即它不能循环)。它主要用于描述类似流程图的过程,其中流程图中的每个元素都是一个条件,它对同一组数据执行不同的测试(无法修改它)。分支可以拆分和合并,但从不以循环方式,即。流程图无法循环回自身。到达分支的末尾时,返回当前状态并退出程序。

当写下来时,一个典型的程序在表面上类似于一个纯函数式语言的程序,除了不允许任何形式的递归,函数永远不会返回任何东西;退出函数的唯一方法是调用另一个函数,或者调用返回当前状态的常规exit语句。通过采用结构化编程语言并删除所有循环语句,或采用“非结构化”编程语言并禁止在代码中反向出现的任何goto或jmp语句,也可以实现类似的效果。

现在我的问题是:是否有一种简洁而准确的方式来描述这种语言?我没有任何正式的CS背景,我很难理解有关自动机理论和形式语言理论的文章,​​所以我有点不知所措。我知道我的语言不是图灵完整的,并且通过巨大的痛苦,我设法向自己保证我的语言可能可以被归类为“常规语言”(即可以通过评估的语言)只读图灵机,但有更具体的术语吗?

如果该术语对于精通一般编程概念但没有正式CS背景的受众直观易懂,则可获得奖励积分。如果有特定类型的机器或自动机评估这种语言,也可以获得奖励积分。哦,是的,请记住,我们没有评估数据流 - 每个元素都有(只读)访问整套输入数据。 :)

2 个答案:

答案 0 :(得分:1)

我相信您的语言足以准确编码star-free languages。这是常规语言的子集,其中没有表达式包含Kleene星。换句话说,它是空字符串的语言,空集和在连接和分离下关闭的单个字符。这相当于DGA接受的语言集,其中没有任何定向循环。

我可以根据您对您的语言的描述尝试此处的证明,但我不确定它是否能正确运行,因为我无法完全访问您的语言。我正在做的假设如下:

  1. 没有任何功能可以返回。调用函数后,它将永远不会将控制流返回给调用者。
  2. 所有调用都是静态解析的(也就是说,您可以查看源代码并构建每个函数及其调用的函数集的图形)。换句话说,没有任何函数指针。
  3. 调用图是非循环的;对于任何函数A和B,则恰好其中一个成立:A传递调用B,B传递调用A,或者A和B都不会传递相互调用。
  4. 更一般地,控制流程图是非循环的。表达式计算后,它永远不会再次计算。这允许我们概括上述内容,以便不考虑调用其他函数的函数,而是将程序视为一系列语句,这些语句都作为DAG相互调用。
  5. 您的输入是一个字符串,其中每个字母只扫描一次,并按照给定的顺序扫描(考虑到您正在尝试对流程图进行建模,这似乎是合理的。)
  6. 鉴于这些假设,这里有一个证明,如果该语言没有星级,你的程序会接受一种语言。

    要证明如果有一种无星级语言,您的语言中有一个接受它的程序,首先要为该语言构建最小状态DFA。无星形语言是无循环的,只扫描输入一次,因此从DFA构建一个以您的语言编写的程序应该很容易。特别是,给定一个状态s,根据下一个输入符号转换到其他状态,你可以编写一个函数 查看输入的下一个字符,然后调用编码正在转换到的状态的函数。由于DFA没有定向循环,因此函数调用没有定向循环,因此每个语句只执行一次。我们现在有了(∀R。是一种无星级语言→∃用您的语言接受它的程序)。

    为了证明暗示的反方向,我们基本上颠倒了这种结构并创建了一个没有与你的程序相对应的循环的ε-NFA。在此NFA上进行子集构建以将其减少为DFA将不会引入任何周期,因此您将拥有无星级语言。构造如下:对于程序中的每个语句s i ,创建一个状态q i ,并转换到与程序中其他语句对应的每个状态离那个陈述只有一步之遥。转换到这些状态将标记为每个决策消耗的输入符号,或ε,如果转换发生而不消耗任何输入。这表明(∀以您的语言编写P,并且存在;无星级语言R只接受您的语言接受的字符串)。

    总而言之,这表明你的程序具有与无星语言相同的力量。

    当然,我对你的程序可以做的假设可能太有限了。您可以随机访问输入序列,我可以通过修改上述结构来处理认为。如果你可能有执行周期,那么整个结构就会中断。但是,即使我错了,我仍然有很多乐趣在想这个,谢谢你度过一个愉快的夜晚。 : - )

    希望这有帮助!

答案 1 :(得分:0)

我知道这个问题有些陈旧,但对后人来说,你所寻找的短语是“决策树”。有关详细信息,请参阅http://en.wikipedia.org/wiki/Decision_tree_model。我相信这可以捕捉到你所做的一切,并且有一个非常具有描述性的名称来启动!