我在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
),但这需要我必须计算所有可能的有效值组合。
我还有其他办法吗?
答案 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] ? ;
...