簡體   English   中英

如何在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)(\\存在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退出該方法)。

使用循環進行“所有人”測試的常規方法如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM