序言。不创建列表
Prolog. Does not create a list
我想创建一个包含 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).
但它 returns 我 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).
它returns我1 解:L=[5,4,3,2,1]
。它运行良好,但顺序不对。
我的第一个代码变体有什么问题?
在第一个变体中,基本情况是错误的:
create(_, 0, []).
此处 End
参数为 0,但您的非基础规则永远不会修改 End
,它是 Start
上的 运行。
因此,只要 Start
等于 End
:
,您的基本情况就应该匹配
create(E, E, []).
您需要对您的程序进行一些调整:
- 停止子句从不统一,因为你不递减
期末。
- Counter 需要计算表达式 Start + 1,因此使用 is/2 运算符。
- 第二个子句不需要删减,第一个分句需要删减。
计划:
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].
我想创建一个包含 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).
但它 returns 我 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).
它returns我1 解:L=[5,4,3,2,1]
。它运行良好,但顺序不对。
我的第一个代码变体有什么问题?
在第一个变体中,基本情况是错误的:
create(_, 0, []).
此处 End
参数为 0,但您的非基础规则永远不会修改 End
,它是 Start
上的 运行。
因此,只要 Start
等于 End
:
create(E, E, []).
您需要对您的程序进行一些调整:
- 停止子句从不统一,因为你不递减 期末。
- Counter 需要计算表达式 Start + 1,因此使用 is/2 运算符。
- 第二个子句不需要删减,第一个分句需要删减。
计划:
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].