Prolog编程列表算法

时间:2014-12-09 19:31:08

标签: list math prolog

这是我的代码,用于制作倒计时程序,当我输入countdown(5,L).时应该返回 L = [5,4,3,2,1]countdown(5,[5,4,3,2,1])应该返回true

输入countdown(5,L).返回

  

错误:是/ 2:输入错误:[]' expected, found [5,4]' (" x"必须包含一个字符)

显示我的程序开始创建列表。

%countdown
countdown(1,[1]).
countdown(A,L) :-
    concat([],[A],Z),
    makeList(Z,A,List),
    L is List.

makeList(X,Y,List) :-
    N1 is Y-1,
    N1 > 0,
    concat(X,[N1],Z),
    List is Z,
    makeList(Z,N1,List).

concat([],Y,Y).
concat([H|X],Y,[H|Z]):-
    concat(X,Y,Z).

2 个答案:

答案 0 :(得分:1)

为什么这么难?

countdown(1, [1]).
countdown(N, [N|T]) :-
    N1 is N-1,
    countdown(N1, T).

答案 1 :(得分:0)

对您的代码的一些评论:

  • countdown/2,第2条第1行:

    concat([],[A],Z)完全没必要。 在本练习结束时,Z[A]统一。

  • countdown/2 ,第2条第3行:**

    正如所指出的,is/2评估右手术语为 算术表达式并将结果与​​左侧统一。 这应该是L = List

    更好的是,只需将上面的行从makeList(Z,A,List)更改为makeList(Z,A,L)

但这太复杂了。如果要采取一般方法,你可以这样做:

count_down(N,L) :- % To count down to 1 from N,
  integer(N) ,     % N must first be integral
  N > 0 ,          % and positive
  range(N,1,L).    % Then you just need to generate the desired range.

range/3可以简单地实现:

range( X , Y , [X]    ) :- X = Y .
range( X , Y , [X|Xs] ) :- X > Y , X1 is X-1 , range(X1,Y,Xs) .
range( X , Y , [X|Xs] ) :- X < Y , X1 is X+1 , range(X1,Y,Xs) .