【问题标题】:Integrating Prolog with C#将 Prolog 与 C# 集成
【发布时间】:2015-01-31 16:42:29
【问题描述】:

我是 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

【问题讨论】:

  • 你是说你是both Prolog C#的新手吗?如果是这样,在您将它们整合在一起之前,我真的会尝试让至少其中一个(最好是两个)感到舒服。顺便说一下,异常应该显示找不到哪个文件 - 在错误消息中查找所有详细信息。
  • 有一个类似的问题和类似的错误。请尝试stackoverflow.com/questions/13556887/…
  • 顺便说一句,还有一个nuget包stackoverflow.com/questions/14555200/…
  • @JonSkeet 我对 Prolog 有基本的了解,并且我使用 C# 完成了一些项目。但整合对我来说很难。不管怎样,谢谢你的建议。

标签: c# prolog ffi swi-prolog


【解决方案1】:

您提供的链接对此错误有完整的解释:

如果找不到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 的正确路径。如常见问题解答中所述:

解决方案

在 Windows 上,将 libswipl.dll 留在安装树中就足够了(即不要将其复制到其他地方)并将安装树的 bin 目录添加到 %PATH%

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

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

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

【讨论】:

  • 是的,我明白了,谢谢。
  • @KALYANI 如果您觉得这个答案有用,您可以将其设置为已接受:)
  • 但我无法修复错误。我添加这样的路径,Environment.SetEnvironmentVariable("SWI_HOME_DIR", @"C:\Program Files\swipl\bin");但什么也没发生
  • @KALYANI 尝试从路径中删除bin
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2016-06-30
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多