Prolog - 从递归谓词返回列表

时间:2016-11-06 18:36:06

标签: list prolog

我正在使用GNU-Prolog,我有以下代码,找到小于X的数字,它们可以被Y整除。假设X和Y> 0

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.

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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).