gpt4 book ai didi

prolog - 列表中每个元素的事实 Prolog

转载 作者:行者123 更新时间:2023-12-02 21:33:27 25 4
gpt4 key购买 nike

我想在Prolog中解决这个问题。我想要给出一个自然数列表来查找列表中满足此条件的所有元素:

它左边的所有元素都比它小,它右边的所有元素都比它大。

例如,给出一个列表[3,2,4,1,5,7,8,9,10,8],答案将是5,7

到目前为止,我已经设法使这个函数在给定列表中的元素的情况下返回 true 或 false,如果该元素满足上述条件。

check(Elem, List) :-
seperate(Elem, List, List1, List2),
lesser(Elem, List1, X1),
bigger(Elem, List2, X2),
size(X1, L1),
size(X2, L2),
size(List, L3),
match(L1, L2, L3),

现在我想创建另一个谓词,给定一个列表,它对列表中的每个元素执行上述计算。由于可能有多个元素满足这一事实,我想创建另一个列表,其中包含满足该问题的所有元素。

问题类似于 ?-predicate_name([[3,2,4,1,5,7,8,9,10,8],N). 结果将是一个元素列表。

抱歉,如果我没有使用正确的 Prolog 术语。我将更具体地描述我想用顺序逻辑语言做什么,尽管这样思考并不是一个好主意。如果我们将谓词检查视为给定列表和列表元素的函数,则无论元素是否满足问题的条件,它都会返回 true 或 false。现在我想解析列表中的每个元素,并为每个元素调用函数 check。如果返回 true,那么我会将该元素添加到另一个列表(也称为结果)中。我想在 Prolog 中执行此操作,但我不知道如何迭代列表。

最佳答案

这是一个使用 DCG 的版本,假设我们要进行算术比较。

list_mid(L, M) :-
phrase(mid(M), L).

mid(M) -->
seq(Sm),
[M],
{maplist(>(M),Sm)},
seq(Gr),
{maplist(<(M),Gr)}.

seq([]) -->
[].
seq([E|Es]) -->
[E],
seq(Es).

通常不值得进一步优化。第一个 seq(Sm) 与后续的 maplist/2 可能会合并在一起。这有点棘手,因为必须单独处理 Sm = []Sm = [_|_] 的情况。

mid(M) -->
( [M]
| max(Mx),
[M],
{Mx < M}
),
min(M).

max(M) -->
[E],
maxi(E, M).

maxi(E, E) -->
[].
maxi(E, M) -->
[F],
{G is max(F,E)},
maxi(G, M).

min(_) -->
[].
min(M) -->
[E],
{M < E},
min(M).

关于prolog - 列表中每个元素的事实 Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21881228/

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