如何在Sicstus Prolog中设置CSP中的变量域

时间:2016-12-16 12:27:52

标签: prolog clpfd meta-predicate

我正在使用Sicstus Prolog,而我正试图解决Domino Puzzle。

我有一个包含三元组的列表,我需要设置它的域名。我知道如何设置单个变量的域或单个变量的列表,但如果我的列表有三元组,并且三元组的每个元素都有不同的域,我怎么能这样做呢?

DV = [R1-C1-D1, R2-C2-D2, ... , R15-C15-D15]

我想做的是:

domain(R1, 1, 4)
domain(C1, 1, 4)
domain(D1, 0, 1)
domain(R2, 1, 4)
domain(C2, 1, 4)
domain(D2, 0, 1)
....
domain(R15, 1, 4)
domain(C15, 1, 4)
domain(D15, 0, 1)

如何在不必明确说明每个变量的情况下执行此操作?

1 个答案:

答案 0 :(得分:3)

描述一个元素的域名:

eldoms(R-C-D) :-
   domain(R, 1, 4),
   domain(C, 1, 4),
   domain(D, 0, 1).

..., maplist(eldoms, RCDs), ...

使用library(maplist)

或者,使用library(lambda)

..., maplist(
        \ (R-C-D) ^ (  domain(R, 1, 4),
                       domain(C, 1, 4),
                       domain(D, 0, 1) ), RCDs), ...