[英]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)(\\存在y \\ in Y)(Z(x,y))
例如,要評估數字x
是否為偶數,我們必須編寫以下公式:
您的問題有一些問題。 第一個是,您提供的代碼片段沒有執行您打算執行的代碼:
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
退出該方法)。
使用循環進行“所有人”測試的常規方法如下:
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;
您也可以使用“一階邏輯庫”,特別是開放源代碼庫。 您可以使用該庫的源代碼和相關設計文檔,例如如何為“命題邏輯”,“一階邏輯”,“條件邏輯”,“關系條件邏輯”和“概率條件邏輯”等概念設計OOP解決方案。 。 例如, http://tweetyproject.org/是使用Java提供給我們的此類庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.