2014-12-07 67 views
2

我在SICStus Prolog的一个程序,运行以下限制:Prolog的动态约束

processList([Elem1,Elem2|_], X) :- 
    (Elem1 #= 0 #/\ Elem2 #= X) #\/ 
    Elem1 #= X. 

但我需要把它设置动态

processList([Elem1,Elem2,Elem3|_], X) :- 
    (Elem1 #= 0 #/\ Elem2 #= 0 #/\ Elem3 #= X) #\/ 
    (Elem1 #= 0 #/\ Elem2 #= X)    #\/ 
    Elem1 #= X. 

如果我有4个元素叫它我会有更大的限制,但模式总是一样的。

我已经查看了表谓词(tuples_in/2,在SWI-Prolog中),但是这就需要我必须计算所有可能的有效值组合。

有没有其他办法可以做到这一点?

回答

2

使用 built-in谓语append/3 Prolog library谓语maplist/2我们写:

 
:- use_module (library(lists)), [ maplist /2]). 

processList(Zs, X) :- 
    append (Prefix, [X|_], Zs), % `Zs` comprises `Prefix`, followed by `X` 
    maplist (= (0), Prefix).  % all items in `Prefix` are equal to 0 

看到它与SICStus Prolog的4.3.2行动!

| ?- processList(Zs, X). 
Zs = [X|_A] ? ; 
Zs = [0,X|_A] ? ; 
Zs = [0,0,X|_A] ? ; 
Zs = [0,0,0,X|_A] ? ; 
Zs = [0,0,0,0,X|_A] ? ; 
... 
+1

我觉得我还不够清楚。我正在使用约束逻辑编程(使用clpr库是精确的),所以我不能确定该元素是否为0(如maplist那样),我需要使用'#'运算符进行限制。当时我告诉我的教授说,我无法制定动态限制,甚至连他都无法解决问题(他们每年都会在课程中添加新问题以避免作弊)。我最终只需要使用第一段代码。 – CMJunior 2015-09-18 13:14:55

+0

@CMJunior。请告诉我更多!我有一段时间没有使用clp(R),但直觉上我会猜测它(原则上)可以与普通的Prolog使用语法统一进行互操作。 – repeat 2015-09-18 13:25:16

+1

我们需要制作一个简易的序言版本作为ABC拼图。其中一个限制是,如果在列或行之前有一个字母,从列/行的角度来看董事会,则需要看到该字母,换句话说,所有的电路板空间,直到看到该字母为止从这个角度来看必须是白色的(在我们的代码中,值为0)。 对于实验室任务,我们还需要使电路板尺寸变为动态,因此用户会告诉程序他想要播放哪种电路板尺寸。这就产生了这个线程的限制问题。 – CMJunior 2015-09-19 14:46:58