[英]Enforcing inequality of lists?
對於給定的 CSP,我使用了多種觀點,其中一種是使用大小為NxNxN
的可變數組的更奇特的布爾模型。 然后我用這個片段強制各種子數組的不平等:
(foreach(X, List1),
foreach(Y, List2),
foreach((X #\= Y), Constraints)
do true),
1 #=< sum(Constraints).
模型的性能很差,所以我很想知道更多幕后發生的事情。 這是確保兩個給定列表不同的正確方法嗎? 我是否正確理解Constraints
列表中的每個約束( X #\\= Y
)在計算總和之前都需要實例化,這意味着所有相應的變量也需要實例化?
約束庫library(ic_global)
這里確實缺少一個約束; 它應該提供lex_ne/2
,類似於lex_lt/2 。 這將與您編寫的代碼具有相同的邏輯和操作行為,即在其參數列表中只剩下一個變量時傳播:
?- B#::0..1, lex_ne([1,0,1], [1,B,1]).
B = 1
為了進行比較,您可以嘗試使用聲音差異運算符~=/2 (在某些 Prolog 中稱為 dif/2)。 這是有效實現的,但它不知道域,因此不會傳播; 它只是等待,直到雙方都被實例化,然后失敗或成功:
?- B#::0..1, [1,0,1] ~= [1,B,1].
B = B{[0, 1]}
There is 1 delayed goal.
?- B#::0..1, [1,0,1] ~= [1,B,1], B = 0.
No (0.00s cpu)
這是否總體上更快將取決於您的應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.