我已经实现了命题逻辑语句的CNF形式的二进制解析树。为了检查命题逻辑的有效性,首先我拆分结合,然后检查是否存在原子或其否定。如果它们存在,而另一个不存在,则该函数返回false。否则返回true
但是,我对此有点麻烦...
bool Tree::Valid(Node *n = NULL)
{
if (n == NULL) n = root;
if (n->data == AND)
return Valid(n->Lchild) && Valid(n->Rchild);
bool normal[26], negated[26];
for (int i = 0; i < 26; ++i)
normal[i] = negated[i] = false;
void checkChild(Node *nChild)
{
if (isalpha(nChild->data))
normal[nChild->data -'a'] = true;
else if (nChild->data == NOT)
negated[nChild->Rchild->data - 'a'] = true;
else
{
checkChild(nChild->Lchild);
checkChild(nChild->Rchild);
}
}
checkChild(n);
for (int i = 0; i < 26; ++i)
{
if (normal[i] != negated[i])
return false;
}
return true;
}
我意识到你不能像这样嵌套这个功能,但我不知道如何绕过它。
感谢您的帮助!
(编辑) 这是我实施的解析树的一个例子。字母是原子,&#39;〜&#39;代表否定......这基本上是说否定正确的孩子(在CNF中总是一个原子)。原子可以是任何字母a-z。有两个二元运算符&#39; +&#39;,&#39; *&#39;和一个一元运算符&#39;〜&#39;。原子可以被认为是布尔变量。