c#垂直投影法_C#逻辑式编程语言极简实现:运行原理

本文通过C#讲解逻辑式编程语言NMiniKanren的运行原理,特别是垂直投影法在目标构造和替换求解中的应用。讨论了Eq、Any和All三种构造目标的方法,以及如何从替换中计算解或判断无解,强调了遍历替换的顺序和代入消元法在求解过程中的作用。
摘要由CSDN通过智能技术生成

(给DotNet加星标,提升.Net技能)

转自:古霜卡比 cnblogs.com/skabyy/p/13209724.html

本系列前面的文章:

《逻辑式编程语言极简实现(使用C#):逻辑式编程语言介绍》

讲NMiniKanren的运行原理。老明敲了敲白板,开始涂画代码,我们从一个喜闻乐见的例子开始。

KRunner.PrintResult(KRunner.Run(null, (k, q) =>
{
var x = k.Fresh();
var y = k.Fresh();
return k.All(
k.Any(k.Eq(x, 1), k.Eq(x, 2)),
k.Any(k.Eq(y, x), k.Eq(y, "b")),
k.Eq(q, k.List(x, y)));
}));

这题我会了!小皮在例子下边写下答案:

[(1 1), (1 b), (2 2), (2 b)]

看到小皮没把昨天的知识忘光,老明略感欣慰:不错。你这个答案是怎么算出来的呢?

呃……就是那个……小皮忽然卡壳了。这种问题就好比几何证明题,明明一眼就能看出来的两条垂直线,真下手证明却发现还挺不容易。小皮抓了几把头发,总算理出一缕思绪:大概就是找出所有条件可能的组合……然后算一下解……小皮一边说,一边在白板上写着:

d15b20be73b1dc52c409b51946b3da34.png

嗯,其实你已经知道怎么算出答案来了。只是对于其中的细节还不甚明了。我们接下来要做的事要理清楚这个计算过程,得到一个每一步都可以由计算机明确执行的算法。

这个算法其实就是你所说这样,找出所有可能的条件组合。每组条件组合可以求出一个解,也可能自相矛盾从而无解。由于NMiniKanren中的条件都是相等条件,所以一组条件组合可以看作一个替换(Substitution)。一个替换能产生一个解,或者无解。

因此,只需解决下面两个问题:

  • 要在什么数据结构上按照什么顺序遍历替换。

  • 如何从替换中算出一个解,或者判断其无解。

遍历分支

首先,我们要从代码构造出一个数据结构(其实就是一张图)。这个数据结构能够按照一定的顺序进行遍历,并依次生成替换。

例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值