Двойные элементы в списке, используя пролог? - PullRequest
1 голос
/ 18 ноября 2010

Как я могу удвоить четные числа в списке в Прологе? Например:

Х = [1,2,3,5,4]

Результат должен быть:

Х = [1,2,2,3,5,4,4]

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 мая 2015

На основании iwhen/2, сначала определите уточненный тестовый предикат eveninteger_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 )).

Затем в сочетании с if_/3 определить integers_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, <b>2</b>, 3,5, <b>4</b> ],
Zs = [1,<b>2</b>,<b>2</b>,3,5,<b>4</b>,<b>4</b>].

Альтернатива # 1

На основе if_//3 определить evenintegerdups//1:

evenintegerdups([]) --> 
   [].
evenintegerdups([X|Xs]) -->
   if_(eveninteger_t(X), [X,X], [X]),
   evenintegerdups(Xs).

Альтернатива # 2

При использовании foldl/4 и lambdas код становится еще короче:

:- use_module(library(lambda)).

evenintegerdups(Xs) -->
   foldl(\X^if_(eveninteger_t(X),[X,X],[X]),Xs).
1 голос
/ 19 ноября 2010

Даже проверку, вероятно, можно сделать лучше, но она вроде работает.

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...