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从从到到,这适用于预加载的航班(在Myvuelos.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”错了吗?哦,很抱歉,我翻译了变量名,以便在此处显示它们。