我在嘗試從C#調用SWI-Prolog時出現問題,它在我的PlTerm變量中給出了一條'Precondition failed'的消息。該計劃是爲了一個學校項目,我正在耗盡時間和想法如何解決這個問題。它應該顯示我從一個機場到另一個機場的所有可用航班。當試圖從swi-prolog獲得列表時,SwiPlcs會拋出'Precondition Failed'
讓我告訴你我的代碼,爲您更好地瞭解我想說:
aeropuerto(a).
aeropuerto(b).
aeropuerto(c).
aeropuerto(d).
aeropuerto(m).
vuelo(1,b,a,1000).
vuelo(2,a,b,900).
vuelo(3,c,a,1200).
vuelo(4,a,c,1400).
vuelo(5,d,c,500).
vuelo(6,b,d,800).
vuelo(7,d,m,600).
vuelo(8,m,d,700).
vDirecto(A,X,Y,B):-vuelo(A,X,Y,B).
vEscalaSimple([T,M],X,Y,Z):-vDirecto(T,X,C,B),vDirecto(M,C,Y,P),suma(B,P,Z),X\=Y.
suma(B,P,Z):-Z is B + P.
reversa(X,A,B):-vuelo(X,B,A,C).
vuelos([A|_],X,Y,B):-vDirecto(A,X,Y,B).
vuelos([A|T],X,Y,B):-vEscalaSimple([A|T],X,Y,B).
vuelos([A|T],X,Y,B):-vDirecto(A,X,Z,D),vEscalaSimple(T,Z,Y,C),suma(D,C,B),reversa(J,X,Z),X\=Y,not(member(A,T)),not(member(J,T)).
misVuelos([A|T],X,Y,B):-vuelos([A|T],X,Y,B).
misVuelos([A|T],X,Y,B):-vDirecto(A,X,Z,D),vuelos(T,Z,Y,C),suma(D,C,B),reversa(J,X,Z),X\=Y,not(member(A,T)),not(member(J,T)),not(length([A|T],3)).
所以這是我在SWI-Prolog的代碼。當我要求「misVuelos(A,B,C,D)」時,Prolog將所有可用的航班顯示爲列表。一切工作完美,當試圖在C#中檢索答案時,問題就來了。
Environment.SetEnvironmentVariable("SWI_HOME_DIR", @"C:\Program Files\swipl");
Environment.SetEnvironmentVariable("Path", @"C:\Program Files\swipl\bin");
List<string[]> temp = new List<string[]>();
string[] _params = { "-q", "-f", _path };
if (!PlEngine.IsInitialized)
{
try
{
PlEngine.Initialize(_params);
PlTerm t1 = new PlTerm("A"), t2 = new PlTerm("B"), t3 = new PlTerm("C"), t4 = new PlTerm("D");
PlTermV termV = new PlTermV(new PlTerm[] { t1, t2, t3, t4 });
using (PlQuery q = new PlQuery("misVuelos", termV))
{
foreach (PlQueryVariables v in q.SolutionVariables)
{
Console.WriteLine(t1.ToString());
/*temp.Add(new string[] {
v["A"].ToString(),
v["B"].ToString(),
v["C"].ToString(),
v["D"].ToString()
});*/
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
PlEngine.PlCleanup();
}
}
return temp;
當試圖獲取變量T1的值,並將其打印到它拋出我一個錯誤說控制檯(再次)「前提條件失敗」。其他變量運行良好(t2,t3和t4),這只是t1給我帶來了問題。我已閱讀文檔,但沒有找到解決方案的運氣。
有人在意解釋爲什麼不工作,以及如何解決這個問題?我錯過了什麼?
此問題也與此問題有關! http://stackoverflow.com/questions/4110394/what-does-this-syntax-mean-prolog – MasterSpark