Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWI prolog到C#断言不工作_C#_Prolog_Swi Prolog - Fatal编程技术网

SWI prolog到C#断言不工作

SWI prolog到C#断言不工作,c#,prolog,swi-prolog,C#,Prolog,Swi Prolog,我正在开发一个解决方案,使用SbsSW.SwiPlCsdll在C#应用程序和prolog.pl源文件之间进行集成,但是我面临着assert(atom)命令的问题 我的prolog文件是一组机场和机场之间的航班,在我的运行期间,我断言新机场和航班如下: internal void alta(Flight new) { try { PlEngine.Initialize(new string[] { "" });

我正在开发一个解决方案,使用
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();
        }
    }
PlQuery q = new PlQuery("assert(fligth(" + new.id + "," + new.airportFrom.id + "," + new.airportTo.id + "," + new.price + "))");
这运行得很好,我没有收到任何错误消息或异常(我曾经收到过一条,但这是因为我的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;
    }
内部列表directFlight(机场起点、机场终点)
{
列表=新列表();
尝试
{
初始化(新字符串[]{”“});
//增压发动机初始化(参数);
PlQuery.PlCall(“咨询(vuelos)”);
//科曼多
//乌纳乌埃斯卡拉(西,从,到)
使用(PlQuery q=newplquery(“directF(W,+from.id+,“+to.id+”)))
{
foreach(q.SolutionVariables中的PlQueryVariables v)
{
添加(v[“W”].ToString());
}
}
}
渔获物(e)
{
Console.WriteLine(e.MessagePl);
控制台写入线(e.Message);
}
最后
{
PlCleanup();
}
退货清单;
}

My
List
变量应返回所有航班id的列表,这些id从
,这适用于预加载的航班(在My
vuelos.pl
上,我调用
PlQuery.PlCall(“咨询(vuelos)”;
),但是我没有考虑到我在运行时创建的任何新航班,我也不知道为什么。

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

        finally
    {
        PlEngine.PlCleanup();
    }
为了解决这个问题,我只需在我的类构造函数中初始化一次我的
PlEngine
,这样我就可以对所有方法使用相同的
PlEngine
。我环顾四周,似乎另一个解决方案是使用
?tell('file.pl')、append(listing(atom))、tell.
在运行时保存该文件,但我不知道它是否会损坏我以前的数据,因此我选择了
PlEngine
解决方法。它不保存易失性数据,但在一个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();
        }
    }
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
的简单咨询或指令


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

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