gpt4 book ai didi

prolog - 查找列表中出现的谓词

转载 作者:行者123 更新时间:2023-12-04 08:33:52 24 4
gpt4 key购买 nike

我正在尝试查找列表中的反转数量。反转将被定义为任何对 a,b来自列表,其中 aia 的索引和 bib 的索引满足 a > bai < bi .本质上 a 在 b 之前,但大于 b。
我做的第一件事是写一个谓词来找出索引是什么。

indexOf(Index, Element, List) :- 
nth1(Index, List, Element).
然后我写了一个谓词来确定任何两个数字的集合是否是反转
isInversion(A, B, List) :-
A \= B, indexOf(AI, A, List), indexOf(BI, B, List), A > B, AI < BI.
在这一点上,我有很多问题,特别是因为我对逻辑编程语言非常不熟悉。我的第一个问题是,indexOf 实际上不会给我索引吗?我很困惑这实际上是如何工作的,因为它似乎基本上必须尝试每个数字,我没有明确告诉它这样做。
如果 indexOf 会像我期望的那样自动确定索引并将其存储在 AI/BI 中,那么我相信我的 isInversion 谓词会正确评估,如果我错了,请告诉我。
我主要关心的是如何实际确定反转的数量。在类似 python 的东西中,我会做
count = 0
for a in puzzle
for b in puzzle
if a is b continue
if isInversion(a, b, puzzle)
count = count + 1
那会给我我的倒数。但是我怎么能在序言中做到这一点? For 循环看起来不是很有风格,所以我不想使用它。
需要注意的是,我已经搜索了其他问题。这有点困难,因为我显然不知道我要寻找什么。但是我只是想明确表示我感觉到诸如 Prolog do predicate for all pairs in List? 之类的东西。没有帮助我回答这个问题。

最佳答案

您应该删除约束 A\=B因为它会因未绑定(bind)的变量而失败。
然后使用 aggregate_all/3 计算所有反转(您实际上并不需要反转的值 A/B):

isInversion(A, B, List):-
indexOf(AI, A, List),
indexOf(BI, B, List),
A > B,
AI < BI.

countInversions(List, N):-
aggregate_all(count, isInversion(_, _, List), N).
sample 运行:
?- countInversions([4,3,2,1,9], N).
N = 6.
您可以使用 findall/3 查看存在哪些反转。在 isInversion 上:
?- findall(A-B, isInversion(A,B,[4,3,2,1,9]), LInversions).
LInversions = [4-3, 4-2, 4-1, 3-2, 3-1, 2-1].

关于prolog - 查找列表中出现的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64905052/

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