如何在面向对象编程中实现存在量词?

时间:2017-06-05 04:18:31

标签: c# oop logic quantifiers

通过(嵌套)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)(\在Y中存在y \)(Z(x,y))

例如,要评估数字x是否为偶数,我们必须编码以下公式:

(\ forall x)(\存在y)(x = y + y) enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

您的问题存在一些问题。首先,您提供的代码段不会执行您打算执行的操作:

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和第一个元素y0上执行一次{ Y中的{1}}然后,根据此测试,两个循环都将中断(因为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 == x”,你可以编写如下内容:

foreach (var x in X)
{
   if (!Y.Any(y => y+y == x))
      return false;
}
return true;

答案 1 :(得分:0)

您还可以使用“一阶逻辑库”,特别是开源库。您可以使用此类库的源代码和相关设计文档,如何为“命题逻辑”,“一阶逻辑”,“条件逻辑”,“关系条件逻辑”和“概率条件逻辑”等概念设计OOP解决方案。 。例如,http://tweetyproject.org/为我们提供了Java中的这样一个库。