作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 list [a, b, a, a, a, c, c]
我需要为每个元素再添加两次。
最终结果应如下所示:
[a, a, a, b, b, b, a, a, a, a, a, c, c, c, c]
dbl([], []).
dbl([X], [X,X]).
dbl([H|T], [H,H|T], [H,H|R]) :- dbl(T, R).
最佳答案
您的代码看起来有点奇怪,因为最后一条规则需要三个参数。你只调用二进制版本,所以没有递归会尝试派生它。
您已经有一个好主意,可以查看列表中元素发生变化的部分。所以有4种情况:
1) 您的列表是空的。
2)你只有一个元素。
3) 您的列表以两个相等的元素开始。
4) 您的列表以两个不同的元素开始。
未指定情况 1,因此您可能需要为此找到一个明智的选择。案例 2 与案例 4 有点相似,因为列表的末尾可以被视为元素的变化,您需要附加两个副本,然后就完成了。情况 3 很简单,我们可以只保留元素并递归其余元素。第 4 种情况是您需要再次插入两个副本。
这意味着您的代码将如下所示:
% Case 1
dbl([],[]).
% Case 2
dbl([X],[X,X,X]).
% Case 3
dbl([X,X|Xs], [X|Ys]) :-
% [...] recursion skipping the leading X
% Case 4
dbl([X,Y|Xs], [X,X,X|Ys]) :-
dif(X,Y),
% [...] we inserted the copies, so recursion on [Y|Xs] and Ys
?- dbl([a,b,a,a,a,c,c],[a,a,a,b,b,b,a,a,a,a,a,c,c,c,c]).
true ;
false.
?- dif(Xs,[a,a,a,b,b,b,a,a,a,a,a,c,c,c,c]), dbl([a,b,a,a,a,c,c],Xs).
false.
?- dbl([a,X,a],Ys).
X = a,
Ys = [a, a, a, a, a] ;
Ys = [a, a, a, X, X, X, a, a, a],
dif(X, a),
dif(X, a) ;
false.
?- dbl(X,[a,a,a,b,b]).
false.
?- dbl(X,[a,a,a,b,b,b]).
X = [a, b] ;
false.
?- dbl(Xs,Ys).
Xs = Ys, Ys = [] ;
Xs = [_G15],
Ys = [_G15, _G15, _G15] ;
Xs = [_G15, _G15],
Ys = [_G15, _G15, _G15, _G15] ;
Xs = [_G15, _G15, _G15],
Ys = [_G15, _G15, _G15, _G15, _G15] ;
Xs = [_G15, _G15, _G15, _G15],
Ys = [_G15, _G15, _G15, _G15, _G15, _G15] ;
[...]
?- length(Xs,_), dbl(Xs,Ys).
Xs = Ys, Ys = [] ;
Xs = [_G16],
Ys = [_G16, _G16, _G16] ;
Xs = [_G16, _G16],
Ys = [_G16, _G16, _G16, _G16] ;
Xs = [_G86, _G89],
Ys = [_G86, _G86, _G86, _G89, _G89, _G89],
dif(_G86, _G89) ;
Xs = [_G16, _G16, _G16],
Ys = [_G16, _G16, _G16, _G16, _G16] ;
Xs = [_G188, _G188, _G194],
Ys = [_G188, _G188, _G188, _G188, _G194, _G194, _G194],
dif(_G188, _G194) ;
[...]
?- f(X) = f(a).
X = a.
?- f(X) \= f(a).
false.
?- f(X) == f(a).
false.
?- f(X) \== f(a).
true.
关于list - 使用 prolog 再添加两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20723455/
我是一名优秀的程序员,十分优秀!