List 使用prolog在列表中添加双元素?
在Prolog中,如何将列表中的偶数加倍? 例如: X=[1,2,3,5,4] 结果应该是: X=[1,2,2,3,5,4,4]List 使用prolog在列表中添加双元素?,list,prolog,dcg,meta-predicate,List,Prolog,Dcg,Meta Predicate,在Prolog中,如何将列表中的偶数加倍? 例如: X=[1,2,3,5,4] 结果应该是: X=[1,2,2,3,5,4,4] 谢谢大家! 即使是检查也可能做得更好,但它有点有效 even(N) :- N mod 2 =:= 0. doubleeven([],[]). doubleeven([H|T], [H,H|Z]) :- even(H), !, doubleeven(T,Z). doubleeven([H|T], [H|Z]) :- d
谢谢大家! 即使是检查也可能做得更好,但它有点有效
even(N) :-
N mod 2 =:= 0.
doubleeven([],[]).
doubleeven([H|T], [H,H|Z]) :-
even(H),
!,
doubleeven(T,Z).
doubleeven([H|T], [H|Z]) :-
doubleeven(T,Z).
基于,
首先定义
eveninteger\u t/2
:
eveninteger_t(I, T) :-
iwhen(nonvar(I), ( 0 is I mod 2 -> T = true ; T = false )).
oddinteger_t(I, T) :- % defined for the sake of completeness
iwhen(nonvar(I), ( 1 is I mod 2 -> T = true ; T = false )).
然后,结合定义整数\u evendups/2
如下:
integers_evendups([], []).
integers_evendups([X|Xs], [X|Zs1]) :-
if_(evenintegers_t(X), Zs1 = [X|Zs0], Zs1 = Zs0),
integers_evendups(Xs, Zs0).
以下是您在问题中提出的问题:
?- Xs = [1,2,3,5,4], integers_evendups(Xs,Zs).
Xs = [1, 2, 3,5, 4 ],
Zs = [1,2,2,3,5,4,4].
备选方案2
使用and,代码变得更短:
:- use_module(library(lambda)).
evenintegerdups(Xs) -->
foldl(\X^if_(eveninteger_t(X),[X,X],[X]),Xs).
非常感谢。Prolog中的列表非常奇怪。@维迪,有什么奇怪的?列表是头和尾(
[H | T]
),其中尾也是一个列表。非常简单。double偶数([2],[2])。
成功,但应该失败。异常命名:Zs
和Zs0
通常用于表示差异。这里没有。所以Zs0
,Zs1
更合适。@false。现在命名更好了吗?不:这样想吧:是否有一个DCG可以这样扩展?
:- use_module(library(lambda)).
evenintegerdups(Xs) -->
foldl(\X^if_(eveninteger_t(X),[X,X],[X]),Xs).