Prolog 查找列表中谓词的出现次数
我试图找出列表中的倒数。反转将被定义为列表中的任何一对Prolog 查找列表中谓词的出现次数,prolog,Prolog,我试图找出列表中的倒数。反转将被定义为列表中的任何一对a,b,其中ai是a的索引,bi是满足a>b和ai
a,b
,其中ai
是a
的索引,bi
是满足a>b
和ai
的b
的索引。本质上,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.
这将给我我的反转量。但是我怎样才能在prolog中做到这一点呢?For循环似乎不太符合风格,所以我不想使用它
需要注意的是,我还搜索了其他问题。这有点难,因为我显然不知道我到底在寻找什么。然而,我只是想说清楚,我觉得这样的事情并不能帮助我回答这个问题。您应该删除约束
A\=B
,因为它会因未绑定变量而失败
然后使用计数所有反转(实际上不需要反转的A/B值):
您可以使用on 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].
对于aggregate_all,一个简单的问题是,为什么isInversion谓词中有
\uu
,以及计数的含义是什么?我不确定所有的模板都是什么,但似乎它用来聚合\uuu
的函数是一个匿名变量。正如我在回答中所评论的,你不需要A
和B
来计算倒数。使用
可防止过梁发出单重警告count
是您想要进行的聚合(计算过程成功的次数),它被用作模板应用于aggregate\u all
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).
?- countInversions([4,3,2,1,9], N).
N = 6.
?- 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].