【问题标题】:SWI-prolog to C# assert not workingSWI-prolog 到 C# 断言不起作用
【发布时间】:2015-06-30 23:51:46
【问题描述】:

我正在研究使用SbsSW.SwiPlCs dll 来集成C# 应用程序和prolog .pl 源文件的解决方案,但是我遇到了assert(atom) 命令的问题。

我的 prolog 文件是一组机场和机场之间的航班,在我的运行时间内,我断言新的机场和航班是这样的:

        internal void alta(Flight new)
    {
        try
        {
            PlEngine.Initialize(new string[] { "" });
            //PlEngine.Initialize(param);

            PlQuery.PlCall("consult(vuelos)");

            //comando
            //flight(v01,bra,ams,1000)
            PlQuery q = new PlQuery("assert(fligth(" + new.id + "," + new.airportFrom.id + "," + new.airportTo.id + "," + new.price + "))");
        }
        catch (PlException e)
        {
            Console.WriteLine(e.MessagePl);
            Console.WriteLine(e.Message);
        }
        finally
        {
            PlEngine.PlCleanup();
        }
    }

这运行良好,我没有收到任何错误消息或异常(我曾经收到一个,但这是因为我的 flight/4 和 airport/2 语句是静态的,我在开始时将两者都更改为动态我的文件,没有抛出任何错误)。

我的问题是当我尝试查阅涉及我在运行时获得的新断言的内容时。

internal List<string> directFlight(Airport from, Airport to)
    {
        List<string> list = new List<string>();

        try
        {
            PlEngine.Initialize(new string[] { "" });
            //PlEngine.Initialize(param);

            PlQuery.PlCall("consult(vuelos)");

            //comando
            //una_escala(W,from,to)
            using (PlQuery q = new PlQuery("directF(W," + from.id + "," + to.id + ")"))
            {
                foreach (PlQueryVariables v in q.SolutionVariables)
                {
                    list.Add(v["W"].ToString());
                }
            }
        }
        catch (PlException e)
        {
            Console.WriteLine(e.MessagePl);
            Console.WriteLine(e.Message);
        }
        finally
        {
            PlEngine.PlCleanup();
        }

        return list;
    }

我的List&lt;string&gt; list 变量应该返回从fromto 的所有航班ID 的列表,这适用于预加载的航班(我的vuelos.pl 上的那些我调用@987654330 @),但我没有考虑到我在运行时创建的任何新航班,我不知道为什么。

【问题讨论】:

  • 我不熟悉prolog,但可能是因为您在断言中拼错了“flight”吗?
  • 哦,对不起,我翻译了变量名以便在此处显示它们。

标签: c# prolog swi-prolog


【解决方案1】:

我的错误在于两个不当行为。 首先,我每次执行查询时都会清理我的 PlEngine

        finally
    {
        PlEngine.PlCleanup();
    }

为了解决这个问题,我所做的只是在我的类构造函数Class Prolog 中初始化我的PlEngine 一次,这样我就可以对我的所有方法使用相同的PlEngine。我环顾四周,似乎另一种解决方案是使用? tell('file.pl'), append(listing(atom)), told. 在运行时保存文件,但我不知道它是否会损坏我以前的数据,所以我选择了PlEngine 解决方法。它不会保存易失性数据,但对于一个 Prolog 会话可以正常工作。我仍然创建了一个方法来清理引擎,当我终止我的程序时我会调用它。

我发现的另一个问题是我试图像这样执行断言参数:

PlQuery q = new PlQuery("assert(fligth(" + new.id + "," + new.airportFrom.id + "," + new.airportTo.id + "," + new.price + "))");

我应该什么时候完成:

PlQuery.PlCall("assert(fligth(" + new.id + "," + new.airportFrom.id + "," + new.airportTo.id + "," + new.price + "))");

PlQuery 专用于返回我能掌握的变量的请求,而PlCall 用于返回true/false 的简单咨询或指令。

希望这对任何人都有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2011-08-22
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多