1

我想创建一个由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]。它工作得很好,但不是按顺序。我的第一个代码变体有什么问题?

4

2 回答 2

1

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

  1. 停止子句永远不会统一,因为您不会减少 End 术语。
  2. Counter 需要计算为表达式 Start + 1,因此使用 is/2 运算符。
  3. 第二个子句不需要删减,但第一个子句需要删减。

程序:

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].
于 2015-03-18T21:46:25.357 回答
1

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

create(_, 0, []).

这里的End参数是 0,但你的非基本规则永远不会修改End,它在Start. 因此,只要Start等于 ,您的基本情况就应该匹配End

create(E, E, []).
于 2015-03-18T21:40:36.687 回答