实现功能:消解算法
输入:合式公式 A 的合取范式
输出:当 A 是可满足时,回答“YES ”;否则回答“NO”。
#include <stdio.h>
#include <string.h>
#define N 50
int Resolvent[N][26];
int total_num, res_num, line;
void convert_form(char str[])
{
total_num = res_num = -1;
line = 0;
int i;
memset(Resolvent, 0, sizeof(Resolvent));
for (i = 0; i < strlen(str); i++)
{
if (str[i] >= 'a' && str[i] <= 'z')
Resolvent[line][str[i] - 'a'] = 1;
else if (str[i] == '&')
line++;
else if (str[i] == '!')
Resolvent[line][str[++i] - 'a'] = 2;
}
}
bool is_same(int p[], int q[])
{
for (int i = 0; i < 26; i++)
if (p[i] != q[i])
return false;
return true;
}
bool not_repeated(int q[])
{
for (int i = 0; i <= line; i++)
if (is_same(Resolvent[i], q))
return false;
return true;
}
bool res(int p[], int q[])
{
int reg_res = 0;
int pos_res = 0;
for (int i = 0; i < 26; i++)
{
if (!p[i] && !q[i])
continue;
if ((p[i] + q[i]) == 3)
pos_res++;
else
reg_res++;
}
if (pos_res != 1)
return true;
if (!reg_res)
return false;
int c[30];
for (int i = 0; i < 26; i++)
{
if ((!p[i] && !q[i]) || (p[i] + q[i] == 3))
c[i] = 0;
else if (p[i] == 1 || q[i] == 1)
c[i] = 1;
else
c[i] = 2;
}
if (not_repeated(c))
{
line++;
for (int i = 0; i < 26; i++)
Resolvent[line][i] = c[i];
}
return true;
}
int main()
{
char str[N];
scanf("%s", str);
convert_form(str);
int i, j;
/*
printf("%d %d %d\n", total_num, res_num, line);
for (i = 0; i < line; i++)
{
for (j = 0; j < 26; j++)
printf("%d ", Resolvent[i][j]);
printf("\n");
}
*/
while (line > res_num)
{
total_num = res_num;
res_num = line;
for (i = 0; i <= total_num; i++)
for (j = total_num + 1; j <= res_num; j++)
if (!res(Resolvent[i], Resolvent[j]))
{
printf("NO\n");
return 0;
}
for (int i = total_num + 1; i <= res_num; i++)
for (int j = i + 1; j <= res_num; j++)
if (!res(Resolvent[i], Resolvent[j]))
{
printf("NO\n");
return 0;
}
}
printf("YES\n");
return 0;
}