Prolog 序言。不创建列表

Prolog 序言。不创建列表,prolog,visual-prolog,Prolog,Visual Prolog,我想创建一个由N元素组成的列表。 我编写以下代码: DOMAINS list = integer* PREDICATES create(integer, integer, list) CLAUSES create(_, 0, []). create(Start, End, [Start|T]):- Start < End + 1,!, Counter = Start + 1, create(Counter,

我想创建一个由
N
元素组成的列表。 我编写以下代码:

DOMAINS
    list = integer*
PREDICATES
    create(integer, integer, list)
CLAUSES
    create(_, 0, []).

    create(Start, End, [Start|T]):-
        Start < End + 1,!,
        Counter = Start + 1,
        create(Counter, End, T).
GOAL
    create(1, 5, L).
它向我返回一个解决方案:
L=[5,4,3,2,1]
。它运行良好,但不符合顺序。
我的第一个代码变体有什么问题?

在第一个变体中,基本情况是错误的:

create(_, 0, []).
此处的
End
参数为0,但您的非基本规则从不修改
End
,它在
Start
上运行。 因此,只要
开始
等于
结束
,您的基本情况就应该匹配:

create(E, E, []).

您需要对程序进行一些调整:

  • stop子句从来都不是统一的,因为您不减少 学期末
  • 计数器需要计算为表达式Start+1,因此使用is/2运算符
  • 你不需要在第二条上删减,但在第一条上删减
  • 节目:

    create(X, X, [X]):- !.
    create(Start, End, [Start|T]):-
            Start =\= End,
            Counter is Start + 1,
            create(Counter, End, T).
    
    Consult(您需要实例化列表,因此使用变量而不是空列表)

    create(X, X, [X]):- !.
    create(Start, End, [Start|T]):-
            Start =\= End,
            Counter is Start + 1,
            create(Counter, End, T).
    
    ?- create(1,5, L).
    L = [1, 2, 3, 4, 5].