如何在 OO 编程中实现存在量词?
Posted
技术标签:
【中文标题】如何在 OO 编程中实现存在量词?【英文标题】:How to implement existential quantifiers in OO programming? 【发布时间】:2017-11-05 19:03:54 【问题描述】:通过(嵌套的)foreach
或 for
循环可以轻松评估和实现包括通用量词在内的逻辑公式:
(\forall x \in X)(\forall y \in Y) (Z(x,y))
foreach (type x in X)
foreach (type y in Y)
if(Z(x,y))
return true;
else
return false;
但是如何在 OO 编程语言,尤其是 C#(不是逻辑编程语言)中实现存在量词?
(\forall x \in X)(\exists y \in Y) (Z(x,y))
例如,要评估一个数字x
是否是偶数,我们必须编写以下公式:
(\forall x)(\exists y) (x = y + y)
【问题讨论】:
【参考方案1】:您的问题存在一些问题。首先是,您提供的代码 sn-p 没有执行您想要执行的操作:
foreach (type x in X)
foreach (type y in Y)
if(Z(x,y))
return true;
else
return false;
这不会针对 X 中的所有值或 Y 中的所有值进行评估。相反,测试 Z(x,y)
将仅在 X 中的第一个元素 x0
和 Y 中的第一个元素 y0
上执行一次. 那么,根据这个测试,两个循环都会中断(因为return
退出了方法)。
使用循环进行“for all”测试的传统方法如下:
foreach (var x in X)
foreach (var y in Y)
if(!Z(x,y))
return false;
return true;
同样,使用循环进行“存在”测试的传统方法是:
foreach (var x in X)
foreach (var y in Y)
if(Z(x,y))
return true;
return false;
但是,在 C# 中,您可以使用 LINQ 消除对循环的需求。所以如果你想检查一组数字X是否包含偶数,你可以这样写:
return X.Any(x => x % 2 == 0);
编辑:为了澄清,在您编辑之后:如果您想编写“对于 X 中的所有 x 在 Y 中存在 y 使得 y+y==x”,您可以编写如下内容:
foreach (var x in X)
if (!Y.Any(y => y+y == x))
return false;
return true;
【讨论】:
让我们考虑X = 2,4,6,8
和Y = 1,2,3,5
。现在让z(x,y): x = y+y
。结果必须为假,但您的代码返回真。该公式实际上是说:“对于所有 x,都有一个 y 使得 x = y+y”。换句话说,“x 是偶数”。
请找到最后上传的图片。
谢谢。您编辑的答案是涵盖集合之间任何关系的一般方法吗?
是的。 LINQ 包含多种作用于集合的方法。
还有,和OO编程一点关系都没有。【参考方案2】:
您还可以使用“一阶逻辑库”,特别是一个开源库。您可以使用此类库的源代码和相关设计文档,例如如何为“命题逻辑”、“一阶逻辑”、“条件逻辑”、“关系条件逻辑”和“概率条件逻辑”等概念设计 OOP 解决方案.比如http://tweetyproject.org/就是为我们提供了这样一个Java库。
【讨论】:
以上是关于如何在 OO 编程中实现存在量词?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何以编程方式在 Android Q OS 中实现可搜索的进度条?