集成SWI-Prolog和C ++的问题

时间:2016-03-15 06:28:53

标签: c++builder ffi swi-prolog

我正在尝试整合Prolog和C ++。我正在使用SWI-Prolog for Prolog和Embarcadero Rad Studio for C ++。我想用C ++输入,在Prolog中处理输入并用C ++显示输出。

首先它是'#34;无法执行链接"错误,但在链接SWI-Prolog库后,它给出了错误: -

  

" [ILINK32错误]错误:' C:\ PROGRAM FILES   (X86)\ SWIPL \ LIB \ LIBSWIPL.LIB'包含无效的OMF记录,类型为0x21   (可能是COFF)"。

我搜索并找到使用" implib.exe"解决它。并创建了一个新的库" newlibswipl.lib"。

在程序中链接后,它会产生如下错误: -

  

[ILINK32错误]错误:未解析的外部' _PL_cut_query'引用   来自C:\ USERS \ DOCUMENTS \ RAD STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ   [ILINK32错误]错误:未解析的外部' _PL_new_term_ref'   从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_exception'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_fatal_error'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_chars_to_term'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_put_term'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_predicate'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_open_query'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_next_solution'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_get_arg'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_get_name_arity'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决   外部' _PL_atom_chars'从C:\ USERS \ DOCUMENTS \ RAD引用   STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:无法执行   执行链接

计划: -

//newprolog.cpp

#include <math.h>
#include <iostream>
#include <sstream> 
#include "SWI-cpp.h"
#include "SWI-Prolog.h"
#include "SWI-Stream.h"

#pragma comment(lib,"C:\Program Files (x86)\swipl\lib\newlibswipl.lib");
using namespace std;

term_t a; 
term_t b;
term_t ans;
functor_t fun;

int main()
{
  int digit;
  cout << "\nPlease enter a digit to calculate it's Factorial.." << endl;
  cin >> digit;
  PlCall("consult(swi('C:\Program Files(x86)\swipl\swipl-win.rc'))"); 
  PlCall("consult('factorial.pl')");
  a = PL_new_term_ref();
  PL_put_integer(a, digit);
  b   = PL_new_term_ref();
  ans = PL_new_term_ref();
  fun = PL_new_functor(PL_new_atom("factorial"),2);
  PL_cons_functor(ans, fun, a, b);
  int fact;
  if(PL_call(ans, NULL)) {
    PL_get_integer(b, &fact);
    //int numb = fact;
 }                   
 return 0;
}

Prolog代码是: - //factorial.pl

factorial(1, 1) :- !.
factorial(X, Fac) :- X > 1,
                 Y is X - 1,
                 factorial(Y, New_Fac),
                 Fac is X * New_Fac.

其实我已经从youtube视频中引用了该视频,其中该人使用了QT创建者而不是Rad Studio ..链接为Swi-Prolog with QT Creator C++ interface 但是我想用Embarcadero Rad Studio来做这件事。 所以任何人都可以帮助我..

1 个答案:

答案 0 :(得分:1)

谢谢大家的建议。 我得到了将SWI-Prolog库与Embarcadero Rad Studio链接的解决方案。

解决方案: -

1)。我在命令提示符下使用 implib.exe 将SWI-Prolog库“libswipl.dll”转换为“coff”格式库,因为库是“omf”格式和所需格式是“coff”。

2)。在获得SWI-prolog库的“coff”格式后,我将其复制到Embarcadero的项目文件夹中并将其包含在项目中。

此包含解决了链接错误并执行了项目。

感谢大家的建议..