Prolog附加到列表中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog附加到列表中相关的知识,希望对你有一定的参考价值。
% Generator for natural numbers
isNatural(0).
isNatural(X) :-
isNatural(Y),
X is Y+1.
rangeToList(From, To, ResultList) :-
isNatural(X),
X > From,
X < To,
% Add X to the ResultList
appendTo(X, ResultList, ResultList),
Tn is To - 1,
% do the same with X to To-1
rangeToList(From , Tn, ResultList).
% appendTo(+Number, +List, -NewList)
appendTo(Number, [], [Number]).
appendTo(Number, List, NewList) :-
append(List, [Number], NewList).
如何将X
附加到ResultList
?每当appendTo
从一开始就到达List = NewList
这不是我的意图,因为我想将List
和[Number]
组合成NewList
。
答案
你的程序有一些问题:如评论中所述“你不能重新分配Prolog变量。一旦ResultList
被实例化,它就不能重新实例化,除非通过回溯”。此外,你需要rangeToList
的基础案例在递归期间阻止它。第三个问题:如果你写X > From, X < To
程序将永远循环,因为你减少每一步的值To
所以,在某一点上,From
将等于To
并且程序将循环(由于你编写isNatural/1
的方式)。最后但不是列表,你需要在递归调用后调用appendTo/3
(我建议你把这个谓词变成尾递归谓词,所以递归调用将是最后一次调用)。我修改了你的程序,但我认为这不是你想要获得的结果
isNatural(0).
isNatural(X) :-
isNatural(Y),
X is Y+1.
rangeToList(A,A,_).
rangeToList(From, To, ResultList) :-
isNatural(X),
X >= From,
X =< To,
Tn is To - 1,
rangeToList(From , Tn, ResultList1),
appendTo(X, ResultList1, ResultList).
appendTo(Number, [], [Number]).
appendTo(Number, List, NewList) :-
append(List, [Number], NewList).
?-rangeToList(1,3,L).
L = [2,2]
要获取实际列表,您需要更改生成数字的方式。解决方案可能是:
rangeToList(A,A,[A]).
rangeToList(From, To, ResultList) :-
From =< To,
From1 is From + 1,
rangeToList(From1 , To, ResultList1),
appendTo(From, ResultList1, ResultList).
appendTo(Number, [], [Number]).
appendTo(Number, List, NewList) :-
append(List, [Number], NewList).
?-rangeToList(1,4).
L = [3,2,1]
以上是关于Prolog附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章