【发布时间】: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<string> list 变量应该返回从from 到to 的所有航班ID 的列表,这适用于预加载的航班(我的vuelos.pl 上的那些我调用@987654330 @),但我没有考虑到我在运行时创建的任何新航班,我不知道为什么。
【问题讨论】:
-
我不熟悉prolog,但可能是因为您在断言中拼错了“flight”吗?
-
哦,对不起,我翻译了变量名以便在此处显示它们。
标签: c# prolog swi-prolog