【发布时间】:2013-11-29 23:55:52
【问题描述】:
我在序言中有一个问题,它需要四个元素列表的所有可能排列(一个元素可以是 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.
【问题讨论】:
-
如果你删除一个 1 你就剩下 3 个元素需要置换?
-
对这些条件写测试,你会发现你已经写好了代码。
-
第二个条件没有意义。如果排列不能包含超过两次的“1”,则原始列表也不能。
-
@SQB 我更新了要求。我应该在该列表中找到的唯一值是 1,2 和 X。所以可能有像 [2,2,2,2] 或[1,1,1,1]。
-
那么你不是在寻找排列。
标签: prolog