2015-04-15 50 views
2

我在嘗試從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給我帶來了問題。我已閱讀文檔,但沒有找到解決方案的運氣。

有人在意解釋爲什麼不工作,以及如何解決這個問題?我錯過了什麼?

+0

此問題也與此問題有關! http://stackoverflow.com/questions/4110394/what-does-this-syntax-mean-prolog – MasterSpark

回答

0

解決方案,發現4個月前

NVM,我找到了解決辦法。我仍然不明白,我會稍後仔細閱讀,但現在,它的工作原理! ^^

來源:

http://www-users.york.ac.uk/~sjh1/courses/L334css/complete/complete2su6.html

Prolog的代碼更改:

vuelos([A|[]],X,Y,B):-vDirecto(A,X,Y,B). 
vuelos([A|[]],X,Y,B):-vEscalaSimple([A|[]],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)). 

現在我可以打印解決方案的C#控制檯沒有問題。

相關問題