簡體   English   中英

強制執行列表的不平等?

[英]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.

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