【问题标题】:Slicing the list in prolog between two indexes在两个索引之间切片prolog中的列表
【发布时间】:2021-12-27 13:33:30
【问题描述】:

我正在尝试对列表进行切片,并创建一个结果列表,其中包含位于两个索引之间的元素,互斥。

indexOf([Element|_], Element, 0). % We found the element
indexOf([_|Tail], Element, Index):-
  indexOf(Tail, Element, Index1), % Check in the tail of the list
  Index is Index1+1.  % and increment the resulting index

less_than(0, 0).
less_than(X, N) :-
    X < N.
    
greater_than(0, 0).
greater_than(X, N) :-
    X > N.

slice([], 0, 0, []).
slice([H|T], I, N, R) :-
    indexOf([H, T], H, Ind), % get the index of the H
    (less_than(Ind, N),
    greater_than(Ind, I), % check if that index is between I and N
    slice(T, I, N, H|R);  % if it is - call the slice again, but append the H to the result
    slice(T, I, N, R)).   % if it's not, just call the slice regularly with the rest of the items

例如,slice([a,b,c,d], 0, 4, R) R 应该是 [b,c]。

现在这总是失败,但我不知道为什么。 它是基本情况,还是括号之间的“if-else”语句? 我想在不使用内置谓词的情况下完成此操作。

【问题讨论】:

  • 当我尝试运行这段代码时,Prolog 只告诉我“indexOf/3 不存在”。它应该如何工作?
  • 什么意思,“两个索引之间,互斥的”。 slice([a,b,c,d], 1, 2, Slice) 会发生什么?
  • 抱歉,忘记添加那部分了。
  • slice([a,b,c,d], 1, 2, Slice) 应该返回空列表。 slice([a,b,c,d], 0, 4, Slice) 应该返回 [b,c]。
  • H|R 不是列表语法。你的意思可能是[H|R]

标签: list prolog slice


【解决方案1】:

您的算法存在一些基本缺陷。您似乎一次处理一项,但没有考虑到您的输入列表不断缩小,因此您应该每次将起始索引减一。您的基本情况可能不应该检查结束索引是否为 0,您永远不会修改它,也不会用 0 调用它。

此外,您的indexOf/3 程序似乎可以找到该项目所在的任何位置(您的列表中可能存在重复项目)。

您还滥用了列表结构[Head|Tail](忘记了方括号)。

您可以使用append/3 进行切片:

slice(L, From, To, R):-
  length(LFrom, From),
  length([_|LTo], To),
  append(LTo, _, L),
  append(LFrom, R, LTo).

在这个答案中,我假设您的索引从 1 开始。

示例运行:

?- slice([a,b,c,d,e], 1, 4, R).
R = [b, c].

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多