Prolog의 목록에서 짝수를 두배로 늘일 수 있습니까? 예 :프롤로그를 사용하여 목록에 이중 요소가 있습니까?
X = 1,2,3,5,4]
결과가 같아야
X = 1,2,2,3 , 5,4,4]
고마워요!
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).
이 답변에 표시된 코드는 reified test predicateeveninteger_truth/2
을 기반으로합니다 : 그냥 완성도를 위해서
eveninteger_truth(I,Truth) :-
( var(I) -> throw(error(instantiation_error ,eveninteger_truth/2))
; \+integer(I) -> throw(error(type_error(integer,I),eveninteger_truth/2))
; 0 is I mod 2 -> Truth = true
; Truth = false
).
,의는 유사하게, 너무 여기 oddinteger_truth/2
을 정의 할 수 있습니다 :
oddinteger_truth(I,Truth) :-
( var(I) -> throw(error(instantiation_error ,oddinteger_truth/2))
; \+integer(I) -> throw(error(type_error(integer,I),oddinteger_truth/2))
; 1 is I mod 2 -> Truth = true
; Truth = false
).
if_/3
및 eveninteger_truth/2
을 기준으로을 정의합니다.210 : 대안으로
?- Xs = [1,2,3,5,4], integers_evendups(Xs,Zs). Xs = [1, 2, 3,5, 4 ], Zs = [1,2,2,3,5,4,4].
, 어떻게 dcg 사용에 대한 : 당신이 당신의 질문에 준 쿼리에서
integers_evendups([],[]).
integers_evendups([X|Xs],[X|Zs1]) :-
if_(evenintegers_truth(X), Zs1 = [X|Zs0], Zs1 = Zs0),
integers_evendups(Xs,Zs0).
살펴 보자? if_//3
을 바탕으로, 우리는 evenintegerdups//1
을 정의
evenintegerdups([]) -->
[].
evenintegerdups([X|Xs]) -->
if_(eveninteger_truth(X), [X,X], [X]),
evenintegerdups(Xs).
우리가 meta-predicatefoldl/4
및 lambdas를 사용하는 경우, 코드를 더욱 간결 얻을 수 있습니다 :
:- use_module(library(lambda)).
evenintegerdupsB(Xs) -->
foldl(\X^if_(eveninteger_truth(X),[X,X],[X]),Xs).
이의 행동이 두 dcg 변종을 보자 :
?- Xs = [1,2,3,5,4], phrase(evenintegerdups(Xs),Zs). Xs = [1, 2, 3,5, 4 ], Zs = [1,2,2,3,5,4,4]. ?- Xs = [1,2,3,5,4], phrase(evenintegerdupsB(Xs),Zs). Xs = [1, 2, 3,5, 4 ], Zs = [1,2,2,3,5,4,4].
감사합니다. 프롤로그의 목록은 매우 이상합니다. – Vidi
@ 비디, 왜 그렇게 이상합니까? 리스트는 머리와 꼬리 ('[H | T]')이며 꼬리 또한리스트입니다. 더 간단 할 수는 없습니다. –
'doubleeven ([2], [2]).'성공하지만 실패합니다. – false