SWI-prolog 到 C# 断言不工作
SWI-prolog to C# assert not working
我正在研究使用 SbsSW.SwiPlCs
dll 集成 C# 应用程序和序言 .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
变量应该 return 从 from
到 to
的所有航班 ID 的列表,这适用于预加载的航班(那些在我的 vuelos.pl
上,我在 PlQuery.PlCall("consult(vuelos)");
上调用),但我没有考虑我在运行时创建的任何新航班,我也不知道为什么。
我的错误在于两个不当行为。
首先,我每次执行查询时都会清理我的 PlEngine
finally
{
PlEngine.PlCleanup();
}
为了解决这个问题,我所做的就是在我的 class 构造函数 Class Prolog
中初始化我的 PlEngine
一次,这样我就可以使用相同的 [=13] =] 对于我所有的方法。我环顾四周,似乎另一种解决方案是使用 ? 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
专用于 return 我能掌握的变量的请求,而 PlCall
用于简单的咨询或说明 return a true/false
.
希望这对任何人都有帮助。
我正在研究使用 SbsSW.SwiPlCs
dll 集成 C# 应用程序和序言 .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
变量应该 return 从 from
到 to
的所有航班 ID 的列表,这适用于预加载的航班(那些在我的 vuelos.pl
上,我在 PlQuery.PlCall("consult(vuelos)");
上调用),但我没有考虑我在运行时创建的任何新航班,我也不知道为什么。
我的错误在于两个不当行为。 首先,我每次执行查询时都会清理我的 PlEngine
finally
{
PlEngine.PlCleanup();
}
为了解决这个问题,我所做的就是在我的 class 构造函数 Class Prolog
中初始化我的 PlEngine
一次,这样我就可以使用相同的 [=13] =] 对于我所有的方法。我环顾四周,似乎另一种解决方案是使用 ? 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
专用于 return 我能掌握的变量的请求,而 PlCall
用于简单的咨询或说明 return a true/false
.
希望这对任何人都有帮助。