2012-04-26 58 views
2

我需要最小化Prolog中的謂詞。目前我正在使用GNU Prolog Java。 我有這個事實 有限域求解器fd_minimize/2

army(Territory,X). 

上面說的是給定的領土得到了X軍隊。現在我想找到給定玩家擁有的最少軍隊數量。所以我寫:

place_army(Player, Territory):- 
    fd_maximize(army(Territory, X), X), 
    owner(Player, Territory). 

的解釋說:

java.lang.IllegalArgumentException異常:我們的目標不是當前活動

了一下,我發現這個問題後:http://www.gprolog.org/manual/gprolog.html#htoc313 我假設問題是解釋器的Java實現沒有FD求解器。任何提示/解決方法?

回答

1

您可以達到fd_minimize/2提供的findall/3keysort/2謂詞的相同結果。

findall(X-T,army(T,X),B),keysort(B,[MinX-Territory|Cs]), 

可以取代

fd_minimize(army(Territory,X),X), 

Territory提供相同的值。

+1

感謝您的回覆。 gnu prolog java實現不提供Keysort方法,我是Prolog的noob,所以我寫了這段代碼: 'place_army(Player,Territory): - findall(X,army(_,X),值), 排序(值,[軍隊| _]), 軍隊(領土,軍隊), 所有者(玩家,地區),!。 – Otacon 2012-04-26 19:05:23

+0

@Otacon:軍隊/等同於另外兩次嘗試。不管怎樣,對於noob來說都不錯! – false 2012-04-26 21:45:49

+0

Thx很多爲您的提示:D(並且非常感謝「noobob」的不壞):D 我決定切換到SWI-PROLOG。它有點重,但它有我需要的一切爲我的小發展:D 但是,仍然,非常感謝您的支持! – Otacon 2012-04-26 21:51:50

2

有一個非常類似名稱的兩個不同的系統:

GNU Prolog的(見),一個ISO Prolog的系統,其採用了這個名字1999-04-19和開拓CLP(FD)的實現是actively developed –最最近的版本在一個小時前發佈。 fd_minimize/2等都是GNU Prolog的一部分。

然後有一個最近的系統叫GNU Prolog for Java - 最近的版本是從2010-08-15

也許這個命名混淆可以解決。

+1

但爲了使這個工作與Java我必須做一個JNI接口! – Otacon 2012-04-26 19:14:17