gpt4 book ai didi

list - Prolog:取列表的前 "N"个元素

转载 作者:行者123 更新时间:2023-12-04 05:38:18 26 4
gpt4 key购买 nike

我需要写一个 Prolog 谓词 take(L, N, L1)如果列表 L1 成功包含第一个 N列表元素 L , 以相同的顺序。例如:

?- take([5,1,2,7], 3, L1).
L1 = [5,1,2]
?- take([5,1,2,7], 10, L1).
L1 = [5,1,2,7]

到目前为止,Prolog 对我来说毫无意义,而且我很难分解它。这是我到目前为止所拥有的:
take([H|T], 0, []).
take([H|T], N, L1) :-
take(T, X, L2),
X is N-1.

你能解释一下我在这里做错了什么吗?

最佳答案

这是一个实现与 take 对应的关系的定义。在像 Haskell1 这样的函数式语言中。首先,参数顺序应该不同,这有利于部分应用。有删减,但只有在内置的错误检查之后才(=<)/2产生 instantiation_error如果参数包含一个变量。

take(N, _, Xs) :- N =< 0, !, N =:= 0, Xs = [].
take(_, [], []).
take(N, [X|Xs], [X|Ys]) :- M is N-1, take(M, Xs, Ys).

?- take(2, Xs, Ys).
Xs = [], Ys = []
; Xs = [_A], Ys = [_A]
; Xs = [_A,_B|_C], Ys = [_A,_B].
请注意上面的查询是如何读取的:

How can one take 2 elements from Xs to get Ys?


并且有3个不同的答案。如 Xs是空的,那么 Ys 也是空的.如 Xs是一个只有一个元素的列表,那么 Ys 也是.如 Xs至少有 2 个元素,那么这两个是 Ys .

1) 唯一的区别是 take(-1, Xs,Ys)失败(对于所有 Xs, Ys )。最好的办法可能是发出 domain_error类似于 arg(-1,s(1),2)

关于list - Prolog:取列表的前 "N"个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27151274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com