2012-02-11 16 views
1

我試圖用prologs約束求解器來解決特定的問題,我堅持:d 的我的問題,需要一個更普遍的版本是這樣的:如何運行在序言暫停目標與約束

:- lib(ic).:- lib(ic). 
solve([A1*X+B1*Y=C1, A2*X+B2*Y=C2]):- 
X::[0..999], 
Y::[0..999], 
X #\= 0, 
Y #\= 0, 

A1*X+B1*Y#=C1, % line1 
A2*X+B2*Y#=C2. % line2 

而這是查詢/目標我使用:

solve([2*X+3*Y=5, 3*X+2*Y=5]). 

,程序會計算X和Y的值(在這種情況下,X = 1,Y = 1在溶液中)。 我在想什麼,如果在目標/查詢參數的數量可能會有所不同..在這種情況下,我的序言程序需要有一個動態暫停的目標,以取代行%line1和%line2註釋。

問題是,我如何讓這些表達式延遲..?我不想在問題中硬編碼,並認爲只有兩個表達式將通過目標傳遞。

希望問題是清楚的。 謝謝。

回答

1

我想你的意思是這樣的:

:- lib(ic). 

solve([]). 
solve([Eq | Eqs]) :- 
     term_variables(Eq, Vars), 
     Vars :: [0..999], 
     (foreach(Var, Vars) do Var #\= 0), 
     Eq = (Lhs = Rhs), 
     Eq0 = (Lhs #= Rhs), 
     call(Eq0), 
     solve(Eqs). 

注意,這是ECLiPSe-CLP特定代碼(在foreach循環可能被轉換爲一個遞歸幫手謂語,當然,和IC庫)。

另請注意,call(Eq0)和只寫Lhs #= Rhs應具有相同的效果(afaik)。但是當Lhs #= Rhs中的變量是求解變量時,似乎並非如此,至少我在幾個月前使用lib(cplex)時遇到過這樣的問題。

+0

感謝您的片段。我不明白這部分代碼: Eq0 =(Lhs#= Rhs) 這是如何工作的?請指導我在線提供合適的材料,以便我可以閱讀關於此類編碼的更多信息。謝謝。 – kallakafar 2012-02-11 16:32:41

+1

@kallakafar:如果你知道變量的值不能爲0,你可以相應地設置域'Vars :: [1..999]'並放棄'foreach'循環。 'Eq0 =(Lhs#= Rhs)'這一行意味着變量'Eq0'與目標'(Lhs#= Rhs)'綁定,但目標沒有執行。它只在下一行調用(Eq0)'中執行。只編寫'Lhs#= Rhs'的問題是,對於ic庫,只允許變量,而不是複雜的術語。在你的情況下,'Lhs'將是一個術語,所以你需要將它包裝在'eval/1'中:'eval(Lhs)#= Rhs'。 – twinterer 2012-02-13 08:01:18

+0

@kallakafar:ECLiPSe的文檔可以在這裏找到:http://www.eclipseclp.org/doc/userman/umsroot.html和這裏:http://www.eclipseclp.org/doc/libman/libman。 HTML。不過,您應該已經收到了ECLiPSe安裝手冊。然後是Helmut Simonis的電子學習課程:http://4c.ucc.ie/~hsimonis/ELearning/index.htm和ECLiPSe教程介紹:http://www.eclipseclp.org/doc/tutorial/index。 HTML。最後,考慮在用戶郵件列表上詢問ECLiPSe的具體問題:https://lists.sourceforge.net/lists/listinfo/eclipse-clp-users – twinterer 2012-02-13 08:06:25