我在prolog中有一个问题,它需要所有可能的四个元素列表的排列(一个元素可以是1,2或X)但我必须在该列表中添加2个约束。它的最后一个元素不能是符号" X"并且排列不能包含符号" 1"超过2次。我不确定在哪里以及如何设置这些限制。任何人都可以给我一些想法吗?
domains
elem=symbol
list=elem*
predicates
elimin(elem,list,list)
perm(list,list)
clauses
elimin(H,T,[H|T]).
elimin(H,[A|T],[A|X]):-
elimin(H,T,X).
perm([],[]).
perm([H|T],X):-
perm(T,T1),
elimin(H,T1,X).
当前代码:
domains
elem=symbol
list=elem*
predicates
valid(list)
generate(list)
count(list,elem,integer)
member(symbol,list)
clauses
valid(S):-
generate(S),count(S,1,C),C<2.
generate([A,B,C,D]) :-
member(A,["1","2","X"]),
member(B,["1","2","X"]),
member(C,["1","2","X"]),
member(D,["1","2"]).
member(X,[X|_]).
member(X,[_|T]):- member(X,T).
count([],_,0).
count([H|T],X,C):- H<>X,
count(T,X,C).
count([H|T],X,C1):- H=X,
count(T,X,C),
C1=C+1.
答案 0 :(得分:2)
从你的评论来看,显然你的烫发/ 2是没用的。
显而易见的方法是使用仅接受有效序列的过滤器加入生成器。 如果发电机避免将1置于最后位置,则程序计数/ 3就足够了。 使用非确定性成员/ 2可以很容易地编写生成器。
注意:将常量保持为小写(x
而不是X
)非常方便。
valid(S) :- generate(S), count(S,1,C), C < 2.
generate([A,B,C,D]) :-
member(A,[1,2,x]),
member(B,[1,2,x]),
member(C,[1,2,x]),
member(D,[2,x]).
看看你是否可以自己写数/ 3 ......