[英]SWI-prolog to C# assert not working
我正在研究使用SbsSW.SwiPlCs
dll在C#應用程序和prolog .pl
源文件之間進行集成的解決方案,但是我遇到了assert(atom)
命令的問題。
我的序言文件是一組機場和機場之間的航班,在運行期間,我斷言新的機場和航班是這樣的:
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 to
的所有航班ID的列表,這適用於預加載的航班(我在vuelos.pl
上調用PlQuery.PlCall("consult(vuelos)");
),但我沒有考慮在運行時創建的任何新航班,也無法弄清楚原因。
我的錯誤是由兩種不當行為引起的。 首先,每次執行查詢時,我都會清理PlEngine
finally
{
PlEngine.PlCleanup();
}
為了解決此問題,我只是在類構造函數Class Prolog
初始化了PlEngine
,這樣我就可以對所有方法使用相同的PlEngine
。 我環顧四周,似乎另一個解決方案是使用? tell('file.pl'), append(listing(atom)), told.
? tell('file.pl'), append(listing(atom)), told.
在運行時保存文件,但我不知道它是否會破壞我以前的數據,因此我選擇了PlEngine
解決方法。 它不會保存易失性數據,但可以在一個Prolog會話中正常工作。 我仍然創建了一種清理引擎的方法,當我終止程序時會調用該方法。
我發現的另一個問題是,我嘗試執行如下的assert參數:
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
指令。
希望這對任何人有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.