将Prolog与C#集成

时间:2015-01-31 16:42:30

标签: c# prolog ffi swi-prolog

我是Prolog和C#的新手。当我尝试将Prolog与C#集成时,我发现了一些错误,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SbsSW.SwiPlCs;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
           // Environment.SetEnvironmentVariable("SWI_HOME_DIR", @"the_PATH_to_boot32.prc");  // or boot64.prc
            if (!PlEngine.IsInitialized)
            {
                String[] param = { "-q" };  // suppressing informational and banner messages
                PlEngine.Initialize(param);
                PlQuery.PlCall("assert(father(martin, inka))");
                PlQuery.PlCall("assert(father(uwe, gloria))");
                PlQuery.PlCall("assert(father(uwe, melanie))");
                PlQuery.PlCall("assert(father(uwe, ayala))");
                using (var q = new PlQuery("father(P, C), atomic_list_concat([P,' is_father_of ',C], L)"))
                {
                    foreach (PlQueryVariables v in q.SolutionVariables)
                        Console.WriteLine(v["L"].ToString());

                    Console.WriteLine("all children from uwe:");
                    q.Variables["P"].Unify("uwe");
                    foreach (PlQueryVariables v in q.SolutionVariables)
                        Console.WriteLine(v["C"].ToString());
                }
                PlEngine.PlCleanup();
                Console.WriteLine("finished!");
            }
        }
    }
}

它没有运行,在运行之前我添加了参考SwiPlCs.dll。但它显示错误“FileNotFoundException未处理,找不到指定的模块。(HRESULT异常:0x8007007E)”。

那么有人可以帮我解决这个错误吗?

我得到了这个编码here

1 个答案:

答案 0 :(得分:4)

您提供的链接完整说明了此错误:

  

如果找不到libswipl.dll或其中一个依赖项,您将收到类似的错误   System.IO.FileNotFoundException:Das angegebene Modul wurde nicht gefunden。 (Ausnahme von HRESULT:0x8007007E)

     

另一个常见错误是:

SWI-Prolog: [FATAL ERROR:
  Could not find system resources]`  
  Failed to release stacks
     

要解决此问题,请按照SWI-Prolog FAQ FindResources中的说明添加SWI_HOME_DIR环境变量,并在此类状态下调用PlEngine.Initialize

Environment.SetEnvironmentVariable("SWI_HOME_DIR", @"the_PATH_to_boot32.prc");

默认情况下,此代码已注释,取消注释并提供the_PATH_to_boot32.prc的正确路径。如FAQ:

中所述
  

解决方案

     

在Windows上,只需将libswipl.dll保留在安装树中(,不要将其复制到别处),然后将安装树的bin目录添加到%PATH%

     

跨平台且强大的解决方案是在调用putenv()之前使用PL_initialise()将适当的路径放入环境中。

...;
putenv("SWI_HOME_DIR=C:\\Program Files\\swipl");
if ( PL_initialise(argc, argv) )
  PL_halt(1);
...
     

在应用程序的最终版本中,您将保存状态链接到可执行文件(使用swipl-ldcat(Unix))并对putenv()调用进行评论。