2016-11-06 3 views
1

에서 목록을 반환하고, 나는 숫자가 Y.으로 나눌 수있는 X 이하의 X 및 Y> 0프롤로그 - 나는 GNU-프롤로그를 사용하고 재귀 술어

find_num(X, Y) :- 
    findall(N, between(1,X,N), List), 
    check_list(List, Y). 

check_list([Head|Tail], Y) :- 
    ( 
     divides(Head, Y) -> 
      format('~w ~s ~w ~n', [Head, "divisible by", Y]); 
     true 
    ), 

check_list(Tail, Y). 

divides(X, Y) :- 
    X mod Y =:= 0. 
가정 찾아 다음 코드가

코드는 숫자에 대한 텍스트를 출력하지만 결과를 X = [1,2,3]과 같은 목록으로 원합니다.

check_list([Head|Tail], Y) :- 
( 
    divides(Head, Y) -> 
     findall(X, determine_item(Head, X), List); 
    true 
), 

check_list(Tail, Y). 

또는

find_num(X, Y) :- 
    findall(N, between(1,X,N), List), 
    findall(N, check_list(List, Y, N), List2), 
    write(List2). 

check_list([Head|Tail], Y, _) :- 
    ( 
     divides(Head, Y) -> 
      Head; 
     true 
    ), 
    check_list(Tail, Y). 

divides(X, Y) :- 
    X mod Y =:= 0. 

어떤 도움을 주시면 감사하겠습니다 :

나는, 예를 목록을 만들 수있는 다양한 방법을 시도했지만 성공하지 못했습니다.

+0

'findall (I, (between 1, X, I), I mod Y = : = 0), List)' – false

답변

1

당신이 목록을 원하는 경우에, 당신의 find_num (그리고 check_list이) 그래서 세 번째 인수를 필요로 ...

무엇

divides(X, Y) :- 
    X mod Y =:= 0. 

find_num(X, Y, Lout) :- 
    findall(N, between(1, X, N), Lin), 
    check_list(Lin, Y, Lout). 

check_list([], _, []). 

check_list([H | Tin], Y, [H | Tout]) :- 
    divides(H, Y), 
    check_list(Tin, Y, Tout). 

check_list([H | Tin], Y, Lout) :- 
    \+ divides(H, Y), 
    check_list(Tin, Y, Lout). 

어떻습니까?

+0

대단히 감사합니다. – housamz