求解C中的连接范式



我正在为一项作业寻求帮助。我必须(用C语言)写一个算法来求解连接正规公式(cnf),几个小时后我就无法使它工作了。。。

我的程序实现了DPLL,更准确地说,正是在选择了一个要实例化的文字之后,我简化了cnf的部分给我带来了问题。我不确定我是否很清楚,所以这里有一个例子:

公式:(a或b)AND(not-a或not-b)AND(not-a或b)

实例化:a=真b=假

如果我在这一点上使用我的函数simple,我最终应该是(not-aorb)不满足,但它告诉我每个子句都满足。

以下是我定义的数据类型(我使用整数而不是字符作为文字,因为它看起来更容易管理):

#define TRUE 1
#define FALSE 0
#define UNDEF -1
typedef int literal;
typedef int* interpretation;
typedef struct node {
    literal lit;
    struct node* next;
} * clause;
typedef struct _formula {
    clause c;
    struct _formula* next;
} * formula;
typedef struct _cnf {
    int nb_lit;
    formula f;
} * cnf;

这是我的简化函数

void simplify(cnf F, interpretation I) {
  clause pred, curr;
  int skip,b=FALSE;
  formula form, parentForm;
  form = F->f;
  parentForm = form;
  // Iterating through each clause of the formula
  while (form != NULL) {
    curr = form->c;
    pred = curr;
    skip = FALSE;
    while (curr != NULL && !skip) {
      b = FALSE;
      // If a literal appears as true and has benn interpreted as true
      if (curr->lit > 0 && I[curr->lit] == TRUE) {
        // We remove the current clause from the formula
        if (parentForm == form) {
          F->f = form->next;
          free(form);
          form = F->f;
          parentForm = form;
        } else {
          parentForm->next = form->next;
          free(form);
          form = parentForm->next;
        }
        skip = TRUE;
      }
      // Same goes with false
      if (curr->lit < 0 && I[-curr->lit] == FALSE) {
        if (parentForm == form) {
          F->f = form->next;
          free(form);
          form = F->f;
          parentForm = form;
        } else {
          parentForm->next = form->next;
          free(form);
          form = parentForm->next;
        }
        skip = TRUE;
      }
      // However if a literal appears as true and is interpreted as false (or
      // the opposite)
      if (curr->lit > 0 && I[curr->lit] == FALSE) {
        // We remove it from the clause
        if(pred == curr)
        {
          curr = curr->next;
          free(pred);
          form->c = curr;
          pred = curr;
          b=TRUE;
        }
        else
        {
          pred->next = curr->next;
          free(curr);
          pred = curr;
        }
      }
      else if (curr->lit < 0 && I[-curr->lit] == TRUE) {
        if(pred == curr)
        {
          curr = curr->next;
          free(pred);
          form->c = curr;
          pred = curr;
          b=TRUE;
        }
        else
        {
          pred->next = curr->next;
          free(curr);
          pred = curr;
        }
      }
      pred = curr;
      if(!b) curr = curr->next;
    }
    parentForm = form;
    if(!skip) form = form->next;
  }
}

很抱歉代码太长了,我不知道该关注什么重要部分。我知道还有其他几个问题,比如内存释放不完整(我认为)。

除此之外,我在尝试调试问题时发现了几个错误,但我觉得我在纠正旧错误的同时创建了新错误:/

如果有人能在这件事上帮我的话,请提前谢谢!此外,我在windows 10上,通过cygwin使用gcc进行编译,如果这很重要的话:

gcc*.c

此外,如果很重要的话,我在windows 10上,通过cygwin使用gcc进行编译

事实上。。。我非常确信这与此无关,所以我没有早点查看,然后在写帖子的时候,它似乎不再那么重要了。

不管怎样,我试过一个linux系统,乍一看它似乎工作得很好。

很抱歉给带来不便

相关内容

  • 没有找到相关文章

最新更新