【发布时间】:2021-11-12 15:31:37
【问题描述】:
有人可以帮我解决这个问题吗,Prolog 语言 从列表中查找前两个元素和后两个元素
答案应该是这样的。
?- my_list([a,b, [c,[h], d], [] ,e, h], Q).
Q = [a,b,e,h]
【问题讨论】:
标签: prolog
有人可以帮我解决这个问题吗,Prolog 语言 从列表中查找前两个元素和后两个元素
答案应该是这样的。
?- my_list([a,b, [c,[h], d], [] ,e, h], Q).
Q = [a,b,e,h]
【问题讨论】:
标签: prolog
一个简单的解决方案是:
my_list([X1,X2|Xs], [X1,X2,X3,X4]) :- reverse(Xs, [X4,X3|_]).
它是如何工作的?
X1 和X2),只需使用统一:?- [a,b, [c,[h], d], [] ,e, h] = [X1,X2|Xs].
X1 = a,
X2 = b,
Xs = [[c, [h], d], [], e, h].
X3 和X4),可以使用reverse/2 和统一:?- [a,b, [c,[h], d], [] ,e, h] = [X1,X2|Xs], reverse(Xs, [X4,X3|_]).
X1 = a,
X2 = b,
Xs = [[c, [h], d], [], e, h],
X4 = h,
X3 = e.
【讨论】:
my_list(List, Result) :-
Result = [A,B,Y,Z],
append([A,B], Tail, List),
append( _, [Y,Z], Tail).
告诉 Prolog 寻找答案,其中 Result 必须是四个元素的列表,前两个元素必须符合位于列表前面的模式,其余部分在 Tail 中,后两个必须符合位于剩余部分的末尾,将我们丢弃的列表中间留给_,因为我们不关心它。
您可以改用nth1/3 通过索引来挑选列表元素; nth1(2, List, Elem) 获取第二个元素。最后一个索引来自 length(List, Len) 并使用数学计算最后一个索引。
或者您可以使用模式匹配来构建谓词来匹配列表[A,B|Tail] 中的前两个项目和两个项目[Y,Z] 的列表,并使用递归来修剪尾巴,直到它只有两个元素。然后将它们合并到 my_list 中。
【讨论】:
在 Prolog 民间传说中有 append/2,它提供了一个简单的解决方案:
my_list(List,[A,B,Y,Z]) :-
append([[A,B],_,[Y,Z]],List).
【讨论】: