[英]How to make path restrictions using Prolog CLP FD?
我正試圖通過Prolog CLP FD使用限制編程來解決提出的難題。 這個難題包含下一個簡單的規則:
現在,在我的代碼中,我已經涵蓋了2x2網格的限制,並且一個必須連接到相同顏色的至少一個。
問題是,我找不到一種方法來建立限制,說明一件必須有一個PATH(連接)到相同顏色的所有其他部分,而不通過相反顏色的部分,所以我得到這種輸出:
0 0 0 0
0 1 0 1
0 1 0 1
0 1 0 0
0 0 0 0
0 1 0 1
0 1 0 1
0 1 0 1
其中1s並非全部相互連接。
如何在CLP FD中編寫這種圖形限制?
編輯:我正在使用SICStus Prolog。
改寫你的情況,以便我們可以更清楚地思考它:
為了使您的程序更具體 ,您必須在您生成的一個答案中找到當前違反的條件,但必須在每個解決方案中保留這些條件,然后使用約束表達此條件。
例如,再考慮一下你的情況:
0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1
這里違反了哪些條件 ? 顯然, 1
件不是沿着路徑。 但是用CLP(FD)描述一條完整的路徑是非常繁瑣的,而且由於這顯然是從考試或家庭作業問題中得出的,因此這個想法表明自己有一個簡單的局部標准來表達所需的條件。
通過“本地”,我的意思是你只需要考慮幾個鄰居而不是整個董事會。
所以,再考慮1
件。 顯然,每1
件有一個鄰居,在這個答案中也是 1。 還有什么? 每1
件有2個鄰居嗎? 目前沒有,不是。 應該每1
件有2個鄰居也是1
嗎? 如果沒有,可以接受多少例外?
如果你考慮這些條件,你肯定會得到一個很好的解決方案。
一個提示:有時, 具體化的約束在這些任務中很有用。 這意味着您可以例如說: B #<==> (X #= Y)
,並且讓B
表示X #= Y
是否成立。 請注意,在這種情況下您甚至可能不需要這樣做。
你們倆最后解決了這個問題嗎?
我對這個問題很感興趣,想看看代碼,如果存在的話。
我認為circuit / 1無法幫助,並希望看到解決這個問題的用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.