2010-11-18 4 views

답변

1

짝수 체크는 아마도 더 잘 수행 될 수 있지만 다소 효과가 있습니다.

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). 
+0

감사합니다. 프롤로그의 목록은 매우 이상합니다. – Vidi

+0

@ 비디, 왜 그렇게 이상합니까? 리스트는 머리와 꼬리 ('[H | T]')이며 꼬리 또한리스트입니다. 더 간단 할 수는 없습니다. –

+1

'doubleeven ([2], [2]).'성공하지만 실패합니다. – false

2

이 답변에 표시된 코드는 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_/3eveninteger_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]. 

, 어떻게 사용에 대한 : 당신이 당신의 질문에 준 쿼리에서

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). 

우리가 foldl/4lambdas를 사용하는 경우, 코드를 더욱 간결 얻을 수 있습니다 :

:- use_module(library(lambda)). 

evenintegerdupsB(Xs) --> 
    foldl(\X^if_(eveninteger_truth(X),[X,X],[X]),Xs). 

이의 행동이 두 변종을 보자 :

 
?- 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]. 
+0

비정상적인 이름 짓기 :'Zs'와'Zs0'는 전형적으로 차이점에 사용됩니다. 여기에는 아무 것도 없습니다. 그래서'Zs0','Zs1'이 더 적절할 것입니다. – false

+0

@false. 명명이 더 나아 졌습니까? – repeat

+0

아니요 : 그렇게 생각하십시오. 그렇게 확장 될 수있는 DCG가 있습니까? – false

관련 문제