2015-03-18 94 views
1

我想創建一個包含N元素的列表。 我寫了下面的代碼:Prolog。不創建列表

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]。它運行良好,但不是按順序。 我的第一個變體代碼有什麼問題?

回答

1

你需要做一些調整,你的程序:

  1. 停止子句是從來沒有統一的,因爲你不遞減 結束期限。
  2. 需要將計數器計算爲表達式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]. 
1

在第一變型的基本情況是錯誤的:

create(_, 0, []). 

這裏End參數爲0,但你非基本規則是永遠不會改變End,它是在Start運行。 所以你的基本情況應符合每當Start等於End

create(E, E, []).