当给出一些输入列表时,我想构建一个新列表,它应该:
示例:
control([H,H|T],K,[K,0|T2]):- control([H|T],[K,0],T2).
control([H,J|T],K,[K,1|T2]):- control([J|T],[K,1],T2).
control([H],G,G).
到目前为止,这是我的代码:
?- control([a,a,b,b],[h],L).
L = [[h], 0, [[h], 0], 1, [[[h], 0], 1], 0, [[[...]|...], 1], 0] ;
L = [[h], 0, [[h], 0], 1, [[[h], 0], 1], 1, [[[...]|...], 1], 1] ;
L = [[h], 1, [[h], 1], 1, [[[h], 1], 1], 0, [[[...]|...], 1], 0] ;
L = [[h], 1, [[h], 1], 1, [[[h], 1], 1], 1, [[[...]|...], 1], 1] ;
false.
但它无法正常工作。
std::set
如何使其正确?
答案 0 :(得分:4)
这是你可以采取的另一种方式......
基于 if_/3
和 (=)/3
定义list_hxys/2
:
list_hxys([E|Es], [h|Xs]) :-
list_hxys_prev(Es, Xs, E).
list_hxys_prev([], [], _).
list_hxys_prev([E|Es], [X|Xs], E0) :-
if_(E = E0, X = y, X = x),
list_hxys_prev(Es, Xs, E).
使用SICStus Prolog 4.3.2的一些示例查询:
| ?- list_hxys([a,a,b,b], Xs). % (query given by the OP)
Xs = [h,y,x,y] ? ; % expected answer
no
| ?- list_hxys(As, [h,y,x,y]). % works the "other" way around, too
As = [_A,_A,_B,_B],
prolog:dif(_B,_A) ? ; % answer with residual goal dif/2
no
答案 1 :(得分:0)
让我们分解一下:
% Two elements being read are the same -> add y
control([H,H|T],[y|R]) :- control([H|T],R).
% Two elements being read are not the same -> add x
control([H1,H2|T],[x|R]) :- H1 \== H2, control([H2|T],R).
在这两个子句中,我们使用除第一个被检查元素之外的所有元素进行递归调用,并分别添加一个' x'或者' y'结果。
现在由您来定义基本情况,但请注意,根据输入列表是否具有均匀或不均匀的元素数量,将需要两个基本情况:一个用于具有单个元素的列表和一个空列表。