Prolog动态约束

时间:2014-12-07 00:16:03

标签: prolog restriction clpfd

我在SICStus 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个元素调用它,我将有更大的限制,但模式总是相同的。

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

我还有其他办法吗?

1 个答案:

答案 0 :(得分: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] ? ;
...