2017-11-17 3 views
3

나는 다음과 같은 코드를 가지고 : 쿼리, ?- pick_even(L,[4,7]).를 실행할 때추가 출력 사용 _

pick_even([], []). 
pick_even([_, H | T], [H | R]) :- 
    pick_even(T, R). 
pick_even([_, H , _ | T], [H | R]) :- 
    pick_even(T, R). 

, 내가 출력 받고 싶은 :

L = [_7650, 4, _7662, 7] ; 
L = [_7650, 4, _7662, 7, _7674] ; 

대신 나는 몇 가지 여분의 출력을 수신하고을 그 내가 원하지 않는 :

L = [_7650, 4, _7662, 7] ; 
L = [_7650, 4, _7662, 7, _7674] ; 
L = [_7650, 4, _7662, _7668, 7] ; 
L = [_7650, 4, _7662, _7668, 7, _7680]. 

어떻게하면 쿼리를 수정하지 않고 이러한 추가 출력을 제거 할 수 있습니까?

나는 프롤로그 할 새로운 브랜드, 그래서 나는 이것이 아주 쉬운 구문 수정 될 것으로 기대합니다. 이다

답변

4
list_evens([], []). 
list_evens([_|Es], Fs) :- 
    list_evens2(Es, Fs). 

list_evens2([], []). 
list_evens2([E|Es], [E|Fs]) :- 
    list_evens(Es, Fs). 

, 당신은 특히 한 요소 목록의 경우를 잊어 버렸습니다.

그리고는 테스트를 위해 가장 좋은 방법은 가장 일반적인 쿼리 걸릴 것입니다 : 이러한 방식으로

?- list_even(Xs, Ys). 
    Xs = [], 
    Ys = [] 
; Xs = [_A], 
    Ys = [] 
; Xs = [_A,_B], 
    Ys = [_B] 
; Xs = [_A,_B,_C], 
    Ys = [_B] 
; Xs = [_A,_B,_C,_D], 
    Ys = [_B,_D] 
; Xs = [_A,_B,_C,_D,_E], 
    Ys = [_B,_D] 
; Xs = [_A,_B,_C,_D,_E,_F], 
    Ys = [_B,_D,_F] 
... 

당신 말 :

오 프롤로그, 왜 내가 알아낼해야하는지 사례에 관심이 있습니까? 제발 이러세요!

그리고 부지런히 Prolog가 공백을 채 웁니다. 따라서 예상되는 모든 대답이 여기에 있는지 확인하기 만하면됩니다.

+1

@Lance_P : 사실, 난 그냥 이름을 개선하고 싶어하고 내 대답을 수정 - 새로운 답을 만들어 어떤 이유로 ... – false