簡體   English   中英

如何在C中編寫一階邏輯公式?

[英]How to code first order logic formula in C?

我是C的新手,也是stackoveflow的新手。 我在編碼第一個oder公式時遇到一些問題

forall([X],implies(X,f(X)))

這里x是一個變量,隱含謂詞,f是函數。 聽起來對於所有x,x都包含x的函數,即f(x)。

使用C。任何形式的建議和幫助將不勝感激。

一階公式具有布爾命題部分(在您的示例中為“ implies(x,f(x))”)和量詞(“ Forall x”)。

您應該已經知道,對函數調用“ f(x)”進行編碼的方式完全是在C語言中進行的。

您可以使用邏輯連接詞將命題部分編碼為布爾C代碼。 對於您的示例,“蘊涵”不是本機C運算符,因此您必須用稍有不同的代碼替代它。 在c中,“?” 運算符可以解決問題。 如果“ a”為真,則“ a?b:c”產生“ b”,否則為“ c”。 例如:

   x?f(x):false

量詞意味着您必須枚舉量化變量的可能值集,該變量始終具有某種抽象類型。 從邏輯上講,此集合可能是無限的,但它不是計算機。 在您的情況下,您需要枚舉可能是“ x”的一組值。 為此,您需要一種表示集合的方法。 在C語言中這樣做的一種俗氣的方法是使用一個數組來保存集合成員X,並遍歷該數組:

type_of_x set_of_x[1000];
  ... fill x somehow ...
for(i=1;i<number_of_set_elements;i++)
{   x= set_of_x[i];
      ... evaluate formula ...
}

由於如果任何命題實例為false,則“ forall”為false,因此當您找到錯誤的示例時,需要退出枚舉:

boolean set_of_x[1000]; // in your example, x must be a boolean variable
// forall x
... fill x somehow ...
final_value=true;
for (i=1;i<number_set_elements; i++)
{  x= set_of_x[i];
   if (x?f(x):false)
      { final_value=false;
         break;
      }
}
... final_value set correctly here...

如果任何命題實例為true,則“ exists”為true,因此當您找到真實結果時,您需要退出枚舉:

// exists x
... fill x somehow ...
final_value=false;
for (i=1;i<number_set_elements; i++)
{  x= set_of_x[i];
   if (x?f(x):false)
      { final_value=true;
         break;
      }
}
... final_value set correctly here...

如果您有多個量詞,則最終會出現嵌套循環,每個量詞一個循環。 如果您的公式很復雜,則可能需要幾個中間的布爾變量來計算各個部分的值。

您還將最終得到各種各樣的“集合”(一些數組,一些鏈表,一些哈希表),因此您將需要學習如何使用這些數據結構。 另外,您的量化值可能不是布爾值,但是沒關系; 您仍然可以將它們傳遞給計算布爾值的函數。 為以下目的計算FOL:

 forall p:Person old(p) and forall f:Food ~likes(p,f)

將使用以下代碼框架(詳細信息留給讀者):

 person array_of_persons[...];
 foods array_of_foods[...]

 for (i=...
 { p=array_of_persons[i];
   is_old = old(p);
   for(j=...
    { f=array_of_foods[j];
      ...
         if (is_old && !likes(p,f)) ...
    }
 }

C是命令式編程語言。 “即時”在這里意味着執行是通過程序員專門告訴計算機做什么來進行的。

對於您想要的, Prolog更合適。 它基於一階謂詞邏輯,並且通過嘗試“找到用戶目標所指定的否定查詢的解析引用”來執行。 這種方法與C非常不同,因為執行更加隱式,並且意圖表達似乎大不相同。

如果您有很多時間,則可以用C編寫自己的約束求解器或Prolog解釋器,但是默認情況下,C不為您要的內容提供一流的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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