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])
我不知道是否有标准的方法来解决它,但这里有一个建议的启发式方法。请注意,我不认为这个建议的性能。
foo( (a, b) | (a, b, d) | (a, c) | (a, c, d) )
- 或|。e、 (a,b)|(a,c)->(a,(b | c))
- 可选性[]。e、 (a,b)|(a,b,d)->(a,b,[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”。首先,让我们指定一些术语
是一个选项[…]
是一个序列
是一种选择…|…
(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] }