Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 生成速记函数签名_Algorithm_Signature_Formal Languages - Fatal编程技术网

Algorithm 生成速记函数签名

Algorithm 生成速记函数签名,algorithm,signature,formal-languages,Algorithm,Signature,Formal Languages,让我们假设函数foo()具有以下四个重载: foo(a, b) foo(a, b, d) foo(a, c) foo(a, c, d) 我想生成一个简洁的字符串,一次表示所有重载。在这种情况下,结果应该是foo(a,(b | c),[d]) 编辑:通常有多个简明表示法。我的目标是得到一个尽可能短的表示,只计算参数。因此foo(a,(b | c),[d])的长度为4,因此优于foo(a,((b,[d])|(c,[d])),后者的长度为5 是否有现有的算法来解决这个(或类似的)问题 如果没有,谁能

让我们假设函数
foo()
具有以下四个重载:

foo(a, b)
foo(a, b, d)
foo(a, c)
foo(a, c, d)
我想生成一个简洁的字符串,一次表示所有重载。在这种情况下,结果应该是foo(a,(b | c),[d])

编辑:通常有多个简明表示法。我的目标是得到一个尽可能短的表示,只计算参数。因此
foo(a,(b | c),[d])
的长度为4,因此优于
foo(a,((b,[d])|(c,[d]))
,后者的长度为5

是否有现有的算法来解决这个(或类似的)问题

如果没有,谁能提出一个方法

我对编程语言并不挑剔(不过我用的是C)

这些规则是:

  • 对于所有重载,具有相同名称的参数表示相同的内容<代码>a是
    a
    b
    b
  • 在所有重载上收集所有不同的参数时(在本例中为a、b、c、d),每个重载都将遵循此参数顺序
  • […]
    意味着可以将所包含的子表达式作为一个整体省略
  • (…|…|…)
    表示选择子表达式之一。为了可读性,这样的子表达式不能为空
进一步说明:函数
bar()


应该表示为
条(a,((b | d | e),f)| c),g,[h,[i])

我不知道是否有标准的方法来解决它,但这里有一个建议的启发式方法。请注意,我不认为这个建议的性能。

  • 您始终可以将此类重载表示为所有可能组合的“普通”形式的“或”ed表达式:

    foo( (a, b) | (a, b, d) | (a, c) | (a, c, d) )
    
  • 如果您想提取更简单的表单,可以尝试贪婪算法。从简单的OR表达式形式开始。然后使用以下基本步骤-比较表达式对,查看它们是否可以按以下方式分组:

    • 或|。e、 (a,b)|(a,c)->(a,(b | c))
    • 可选性[]。e、 (a,b)|(a,b,d)->(a,b,[d])
    应完成基本步骤:

    • 直到无法分组为止
    • 递归:算法应该遍历子表达式,检查内部对是否可以分组
  • 上述算法不能保证最佳形式。例如,在foo输入上可能执行上述算法(“{”仅用于可读性,它们与“(”)相同:

    这比你提出的形式复杂得多,a,(b | c),[d]。若要生成表达式的最佳形式,您应首先声明什么是最佳形式。。根据此声明,您可以决定是否可以使用贪婪算法作为起点,并强制对结果进行优化以满足您的需要,或者您应该使用另一种算法

    以下是如何获得更优化表单的演示:

  • 在可选性之前,可以强制算法按或表达式分组。这样,上述执行无效,典型执行如下:

    (a, b) | (a, b, d) | (a, c) | (a, c, d)
    {a, (b | c)} | (a, c) | (a, c, d)
    {a, (b | c)} | (a, b, d) | (a, c, d)
    a, { (b | c) | (b, d) | (c, d) }
    a, { (b | c) | (b | c, d) }
    a, { (b | c) , [d] }
    
  • 该算法可以追溯所有可能的分组操作顺序,以找到存在的最佳形式


  • 实际上,这个问题可以归结为简化逻辑电路。 可以使用卡诺图执行简化:

    编辑:电路最小化问题:


    基于函数参数之间不存在阶数变化的假设,从过载问题到电路最小化的一种简化方法。这种简化是通过编写一个真表来实现的,其中电路的输入参数正好是函数的所有可能参数,对于每个现有过载,输出电路的t对于所有(确切地说)过载参数都为“1”的行将为“1”。

    首先,让我们指定一些术语

    • […]
      是一个选项
    • 是一个序列
    • …|…
      是一种选择
    这个问题似乎很棘手,原因有两个。首先,语法与布尔表达式中的语法不同。例如,虽然选择类似于OR,但它的意思是“取任意一个”,而不是“取至少一个”。因此,生成最佳布尔表达式的算法在“转换”后可能会产生次优结果根据我们的语法

    第二,最优解可能类似于选项中的一个序列,因此任何只能创建一种结构(如序列选择)的算法都不可能总是返回最优解

    下面介绍了我找到的解决方案。还有

    首先,我们需要在所有重载上创建一个包含所有不同参数的列表。根据问题,每个重载将遵循此参数顺序。因此,每个重载都可以表示为一个布尔数组,其中每个条目指示是否存在相应的参数。现在,给出了参数列表以及重载列表对于如下工作方式的递归函数:

  • 删除重复的重载,以便每个重载都是不同的
  • 若只有一个重载,则返回所用参数的序列
  • 如果其中一个重载为空:使用所有其他重载递归调用函数,并在选项中返回结果
  • 将参数列表拆分为常量区域(对于所有重载都相同)和独立区域。每个独立区域应尽可能短。如果可以接受任何重载并将该区域内的标志替换为任何其他重载中的标志,则该区域是独立的。如果此拆分导致至少一个常量区域,则返回包含常量部分的序列并递归索引
        (a, b) | (a, b, d) | (a, c) | (a, c, d)
        (a, b, [d]) | (a, c) | (a, c, d)
        (a, b, (c | [d]) | (a, c, d)
        a, {(b, {c | [d]}) | (c, d)}
    
    (a, b) | (a, b, d) | (a, c) | (a, c, d)
    {a, (b | c)} | (a, c) | (a, c, d)
    {a, (b | c)} | (a, b, d) | (a, c, d)
    a, { (b | c) | (b, d) | (c, d) }
    a, { (b | c) | (b | c, d) }
    a, { (b | c) , [d] }