簡體   English   中英

如何使用Prolog CLP FD進行路徑限制?

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

改寫你的情況,以便我們可以更清楚地思考它:

  1. 你已經可以生成答案了
  2. 答案目前過於籠統

為了使您的程序更具體 ,您必須在您生成的一個答案中找到當前違反的條件,但必須在每個解決方案中保留這些條件,然后使用約束表達此條件。

例如,再考慮一下你的情況:

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.

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