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附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Prolog 中附加列表?

NSURLErrorDomain 中代码的含义是啥?

片段未附加到我的活动

如何使用append / 3以递归方式在prolog中构建列表?

片段未附加到上下文

将 ColumnTransformer() 结果附加到管道中的原始数据?