如何在 OO 编程中实现存在量词?
How to implement existential quantifiers in OO programming?
通过(嵌套)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)
你的问题有些问题。首先是,您提供的代码片段未执行您打算执行的操作:
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.
中为我们提供了这样一个库
通过(嵌套)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)
你的问题有些问题。首先是,您提供的代码片段未执行您打算执行的操作:
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.
中为我们提供了这样一个库