通过(嵌套)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)(\在Y中存在y \)(Z(x,y))
例如,要评估数字x
是否为偶数,我们必须编码以下公式:
答案 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中的这样一个库。