序言。不创建列表

时间:2015-03-18 21:19:40

标签: 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, End, T).
GOAL
    create(1, 5, L).

但它返回No Solution

另一方面,如果我像这样改变Counter的方向:

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

    create(N,[N|T]):-
        N > 0,
        NN = N - 1,
        create(NN,T).
GOAL
    create(5,L).

它返回1解决方案:L=[5,4,3,2,1]。它工作得很好,但不在订单中。 我的第一个代码变体有什么问题?

2 个答案:

答案 0 :(得分:1)

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

create(_, 0, []).

此处End参数为0,但您的非基本规则永远不会修改End,它在Start上运行。 因此,只要Start等于End

,您的基本案例就会匹配
create(E, E, []).

答案 1 :(得分:1)

您需要对您的计划进行一些调整:

  1. stop子句永远不会统一,因为你不会减少 结束语。
  2. 计数器需要被评估为表达式Start + 1,因此请使用is / 2运算符。
  3. 你不需要第二个条款,但第一个条款。
  4. 计划:

    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].