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