Prolog 计算第一个元素和特定元素序言之间的空间之和

Prolog 计算第一个元素和特定元素序言之间的空间之和,prolog,Prolog,基本上,如果给定两个参数,一个列表和一个数字,您将计算从第一个元素到特定字母的空格量,您将如何生成谓词 例如,假设“w”是字母,给出了语句 h1([e,w,b,a,w,w,c], 10) 将返回true,因为10=1+4+5,其中1,4,5是与元素0的距离,如果不是10,则将返回false 这是我到目前为止得到的 h2(List, H) :- sum(List,0,H). sum([],TotalCount,TotalCount):- !. sum([w|T],CurrentCount,

基本上,如果给定两个参数,一个列表和一个数字,您将计算从第一个元素到特定字母的空格量,您将如何生成谓词

例如,假设“w”是字母,给出了语句

h1([e,w,b,a,w,w,c], 10) 
将返回true,因为10=1+4+5,其中1,4,5是与元素0的距离,如果不是10,则将返回false

这是我到目前为止得到的

h2(List, H) :- sum(List,0,H).

sum([],TotalCount,TotalCount):- !.
sum([w|T],CurrentCount, TotalCount) :-
  NewCount is CurrentCount + CountSince,
  sum(T, NewCount, 0)
sum([_|T], NewCount, 0) :-
  CountSince is CountSince + 1,
  sum(T, NewCount, CountSince).

如评论中所述,您可以使用三行代码解决此问题,使用
findall/3
sum\u list/2
。代码如下:

h2(L,E,V):-
    findall(P,nth0(P,L,E),LP),
    (   LP = [] ->   false;
    sum_list(LP,V)).
我编写了
h2/3
和not
h2/2
,以使其更模块化(即,您可以将要查找的元素传递给predcate)。由于如果元素不在列表中,您希望将
false
作为答案,因此我添加了一个if语句来检查
findall/3
中的列表是否为空。如果不是,只需使用
sum\u list/2
对元素求和即可

?- h2([e, w, b, a, w, w, c],f,V).
false

?- h2([e, w, b, a, w, w, c],w,V).
V = 10 

请展示您尝试过的内容并提出一个具体问题。@Lowerer编辑以展示我到目前为止的情况,以及您提出具体问题的含义。有几个问题:(1)在您的第二个
sum/3
子句中,
countsing
是单例,以及(2)在你的第三个子句中,你有
CountSince是CountSince+1
,它总是会失败,因为
CountSince
的值永远不能与
CountSince+1
的值相同。我会再次尝试使用
findall/3
nth0/3
sumlist/2
,而不是试图手工构建所有这些机器。太棒了!我会忽略这个条件,满足于
h2(…,f,V)
V
统一为0。