类问题(c ++和prolog)

时间:2010-04-22 11:26:07

标签: c++ swi-prolog

我正在使用Prolog的C ++接口(SWI-cpp.h的类和方法)。为了解决约翰喜欢玛丽和艾玛以及萨拉的简单回溯:

likes(john, mary).
likes(john, emma).
likes(john, ashley).

我可以这样做:

{
  PlFrame fr;
  PlTermv av(2);
  av[0] = PlCompound("john");
  PlQuery q("likes", av);
  while (q.next_solution())
  {
   cout << (char*)av[1] << endl;
  }
}

这适用于单独的代码,因此语法是正确的。但我也试图得到这个 在课堂上进行简单的回溯:

class UserTaskProlog
{
  public:
                UserTaskProlog(ArRobot* r);
                ~UserTaskProlog();
  protected:
                int cycles;
                char* argv[1];
                ArRobot* robot;
                void logTask();
};

这个类工作正常,我的循环变量递增每个机器人循环。但是,当我运行我的主代码时,我收到一个Unhandled Exception错误消息:

UserTaskProlog::UserTaskProlog(ArRobot* r) : robotTaskFunc(this, &UserTaskProlog::logTask)
{
  cycles = 0;
  PlEngine e(argv[0]);
  PlCall("consult('myFile.pl')");
  robot->addSensorInterpTask("UserTaskProlog", 50, &robotTaskFunc);
}

UserTaskProlog::~UserTaskProlog()
{
  robot->remSensorInterpTask(&robotTaskFunc);
  // Do I need a destructor here for pl?
}

void UserTaskProlog::logTask()
{
  cycles++;
  cout << cycles;
  {
    PlFrame fr;
    PlTermv av(2);
    av[0] = PlCompound("john");
    PlQuery q("likes", av);
    while (q.next_solution())
    {
     cout << (char*)av[1] << endl;
    }
  }
}

我有PlFrame的开始和结束括号。我有我的框架,我的查询等...完全相同的代码,回溯和打印玛丽和艾玛和萨拉。我在这里错过了什么,我收到了错误消息?

以下是我认为代码应该做的事情:我希望mary,emma和sara可以打印一次,每次循环增量。但是,它会自动打开SWI-cpp.h文件并指向类PlFrame。它试图告诉我什么?我没有看到我的PlFrame类声明有什么问题。

谢谢,

1 个答案:

答案 0 :(得分:0)

你不能将指针传递给像这样的实例方法,你可能必须创建C函数包装器来传递给addSensorInterpTask()。这似乎是问题的根源,因为机器人使用不正确的参数调用方法。此外,您应该捕获PlException并检查它告诉您的内容。 无论如何,你的例子不能按原样编译,因为它不完整(什么是ArRobot?)和不精确(ashley v.s. sara)。请尝试在提交问题之前想象其他人如何在没有麻烦的情况下重现您的问题。