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

How to implement existential quantifiers in OO programming?

通过(嵌套)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)

你的问题有些问题。首先是,您提供的代码片段未执行您打算执行的操作:

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;

同样,使用循环进行 "exists" 测试的常规方法是:

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);

编辑:澄清一下,在你编辑之后:如果你想编码 "for all x in X exists y in Y such that y+y==x",你可以这样写:

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

您还可以使用 "First-Order Logic Library" 特别是一个开源库。您可以使用此类库的源代码和相关设计文档,例如如何为 "Propositional Logic"、"First-Order Logic"、"Conditional Logic"、"Relational Conditional Logic" 和 [=18= 等概念设计 OOP 解决方案].例如,http://tweetyproject.org/ 在 Java.

中为我们提供了这样一个库