非确定性选择与AMB-运营商
-
22-08-2019 - |
题
是否有可能实现对麦卡锡的amb
运营商在C#非确定性选择?
显然.NET缺少支持继续但yield return
可能是有用的。这将是可能的其他静态.NET的语言,如F#?
解决方案
是,yield return
确实延续的一种形式。虽然许多有用的情况下,LINQ的提供的函数运算符,让你插在一起慵懒的序列发生器,所以其实在C#3,没有必要使用yield return
这么大(以添加自己的更多的LINQ式扩展时除外插上库,例如拉链,展开)的间隙。
在示例中,我们通过factorise蛮力的整数。基本上在C#相同的例子可以用做内置LINQ运算符:
var factors = Enumerable.Range(2, 100)
.Join(Enumerable.Range(2, 100),
n => 1, n => 1, (i, j) => new { i, j })
.First(v => v.i*v.j == 481);
Console.WriteLine("Factors are " + factors.i + ", " + factors.j);
下面的出发点是我的两个呼叫Enumerable.Range
,这是内置到LINQ,但你可以实现自己的:
IEnumerable<int> Range(int start, int stop)
{
for (int n = start; n < stop; n++)
yield return n;
}
有两个奇参数,所述n => 1
,n => 1
参数Join
。我挑选1作为Join
使用匹配起来项时,因此,所有的组合将匹配,因此我得到从范围试验编号的每一种组合的密钥值。
然后我把一对值成一种元组(匿名类型)其中:
(i, j) => new { i, j })
最后,我挑选第一个这样的元组,其为我的测试得到满足:
.First(v => v.i*v.j == 481);
<强>更新强>
调用First
中的代码不必是仅仅一个短的测试表达。它可以是一个整体的大量命令性代码需要被“重新启动”,如果测试失败:
.First(v =>
{
Console.WriteLine("Aren't lambdas powerful things?");
return v.i*v.j == 481;
);
因此潜在地需要使用不同的值来重新启动该程序的一部分进入该拉姆达。每当拉姆达希望与不同的值重启本身,它只是返回false - 调用amb
不带参数的等效
其他提示
这是不是一个回答你的问题,但它可能会得到你想要的东西。
AMB用于非确定性计算。正如你可能知道,Prolog是使用统一的概念来绑定变量赋值(基本上是AMB最终做)。
一个不确定的语言有IS的这种功能在C#,称为YieldProlog一个实现。如你猜到,收率操作者是一个重要的必要条件此。
不隶属于 StackOverflow