如何在 OO 编程中实现存在量词?

Posted

技术标签:

【中文标题】如何在 OO 编程中实现存在量词?【英文标题】:How to implement existential quantifiers in OO programming? 【发布时间】:2017-11-05 19:03:54 【问题描述】:

通过(嵌套的)foreachfor 循环可以轻松评估和实现包括通用量词在内的逻辑公式:

(\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,8Y = 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 编程中实现存在量词?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中实现装饰器?

用代码说话:如何在Java中实现线程

我们如何以编程方式在 Android Q OS 中实现可搜索的进度条?

如何在生产中已经存在的应用程序中实现 Android TV 模块?

如何在一个类中实现异步

如何在python中实现函数式编程中的嵌套for循环?