Prolog 计算第一个元素和特定元素序言之间的空间之和
基本上,如果给定两个参数,一个列表和一个数字,您将计算从第一个元素到特定字母的空格量,您将如何生成谓词 例如,假设“w”是字母,给出了语句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,
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
和noth2/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。