簡體   English   中英

C#的SWI序言斷言不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM