簡體   English   中英

CLP(FD) 可變域和傳播

[英]CLP(FD) variable domains & propagation

在上學期的 Prolog 課程中,我在引入 CLP 時落后了一點。 現在我正在努力追趕,並嘗試了教授提供給所有學生的過去考試。

特別是,有這樣一個問題:

以下查詢后,CLP(FD) 中決策變量 Z 的域是什么:

?- X in 1..7, Y in -3..100, Y #> X, Z #\\= 0, Z #= Y - X.

在我看來答案應該是

Z in 1..99

但是當我在 SWI-Prolog 安裝中運行它進行仔細檢查時,我得到了

Z in -5.. -1\/1..99

這似乎是基於對X & Y的最大值和最小值的簡單比較,而不考慮鏈接它們的約束( Y #> X )。

我意識到必須在此處對可行性做出讓步,並且返回的域有時會比它們應有的限制更少,但我很驚訝地看到它在這樣一個簡單的例子中失敗了。

我的問題

  1. 我認為這與 CLP 如何選擇在內部傳播(或不傳播)各種約束有關,但我不明白它是如何做到的 - 這對我來說都是一個黑匣子。 CLP 如何准確地(或近似地失敗)傳播其約束?
  2. 沒有辦法讓 CLP(FD) 適當地應用約束,也許是通過重新排序? 我已經嘗試在最后添加一個額外的Y #> X ,但這並沒有改變任何變量域。

在我看來答案應該是

Z in 1..99

你怎么能確定你是對的? 這是約束的一個很好的屬性:您可以最輕松地驗證這一點:

?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y -X.
X in 1..7,
Z+X#=Y,
X#=<Y+ -1,
Z in -5.. -1\/1..99,
Y in 2..100.

?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y -X, Z #< 0.
false.

好的,現在我相信你說的了。

所以,你在這里發現的不一致是在SICStus'本土也存在library(clpfd)以及library(clpz) 首先請注意,給出的答案沒有錯誤! 它說:是的, X in 1..7, Z+X#=Y, X#=<Y+ -1, Z in -5.. -1\\/1..99, Y in 2..100.提供了X in 1..7, Z+X#=Y, X#=<Y+ -1, Z in -5.. -1\\/1..99, Y in 2..100. 是真的。 嘿,這不是真的。

所以這個答案有點像許多保險合同中的法律術語,他們說,是的,我們將支付,前提是所有這些微小的無法閱讀的印刷品都保留了下來,但實際上,您可以用一個巨大的false代替那堵縮微文本牆。

通常,這種不一致是不可避免的,因為在上述系統中定義的 CLP(FD)/CLP(Z) 允許制定無法確定的問題。 因此,無論您的約束求解器如何進化,我們都可以保證總會有我們無法解決的情況。 這是一個科學的數學定律,比重力或速度限制等經驗定律可靠得多。

這里的不一致實際上是一種工程權衡。 只要沒有人抱怨並且沒有令人信服的用例,此類系統的開發人員就不會看到改進的理由。 畢竟,這樣的改進可能會減慢現有用例的速度。

  1. CLP 如何准確地(或近似地失敗)傳播其約束?

實際上,對於任何實際大小的問題,沒有人知道。 但這也不是必須的。 在 CLP(FD) 的情況下,基本元素是附加到邏輯變量的域。 您將它們視為(in)/2個目標,例如Z in -5.. -1\\/1..99 它們之間連接的是實際的約束。 在你的情況下Y #> XZ #= YX 這些約束現在只看到變量的域並嘗試保持它們之間的一致性。 作為更粗略的近似,域被視為區間,因此Z in -5 .. 99而不是上面。 (他們中的大多數)沒有看到的是其他約束。 在這種情況下, Y #> XZ #= YX之間沒有直接聯系。 因此不一致。 這種有限的一致性檢查更容易實現,而且速度也非常快,並且通常優於更完整的算法。 隨着更好算法的發現,事情也在發展。 一個很好的例子是all_distinct/1 ,它使用 Regin 算法保持所有變量之間的一致性,而all_different/1只保持每對變量之間的一致性。 但無論如何:這些事情不斷發展,這是一道考試題,這有點令人驚訝。

  1. 有什么方法可以讓 CLP(FD) 適當地應用約束......?
?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y -X, clpfd:contracting([X,Y,Z]).
X in 1..7,
Z+X#=Y,
X#=<Y+ -1,
Z in 1..99,
Y in 2..100.

但大多數人會忽略這個問題,只添加labeling([],[X,Y])

  1. Z的域是什么?

這是一個模棱兩可的問題。 給出兩者作為答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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