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].