Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用prolog在列表中添加双元素?_List_Prolog_Dcg_Meta Predicate - Fatal编程技术网

List 使用prolog在列表中添加双元素?

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

在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]) :-
    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).