【问题标题】:How to implement existential quantifiers in OO programming?如何在 OO 编程中实现存在量词?
【发布时间】: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)

【问题讨论】:

    标签: c# oop logic quantifiers


    【解决方案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库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多