List 在Prolog中,有没有一种方法可以只对包含字母和整数的对列表中的整数求和?
我很难找出如何找到成对列表中的整数之和,如下所示:List 在Prolog中,有没有一种方法可以只对包含字母和整数的对列表中的整数求和?,list,prolog,List,Prolog,我很难找出如何找到成对列表中的整数之和,如下所示: [[a, 1], [b, 2], [c, 3], [d, 4]] 我尝试过这样的方法,因为它让人联想到正则和函数: sum([], 0). sum([[_,Head]|[_,Tail]], Sum) :- sum([_,Tail], Sum2), Sum is Head+Sum2. 电话是: sum([[a, 1], [b, 2], [c, 3], [d, 4]], Total), write('Sum = '), writ
[[a, 1], [b, 2], [c, 3], [d, 4]]
我尝试过这样的方法,因为它让人联想到正则和函数:
sum([], 0).
sum([[_,Head]|[_,Tail]], Sum) :-
sum([_,Tail], Sum2),
Sum is Head+Sum2.
电话是:
sum([[a, 1], [b, 2], [c, 3], [d, 4]], Total),
write('Sum = '), write(Total).
但这不起作用。它打印出false,此时它应该打印出总和,这里是10。我认为将其分为两个任务可能会有所帮助:
item2list([], []).
item2list([[_, X|_]|T], [X|T2]) :-
item2list(T, T2).
或者我们可以使用和:
或者我们可以根据和编写item2list
:
尽管这里的谓词不是双向的
例如:
?- item2list([[a, 1], [b, 2], [c, 3], [d, 4]], L).
L = [1, 2, 3, 4].
我把总结列表作为一个练习。在您试图定义谓词
sum/2
时,您没有正确处理列表列表。尝试:
sum(Lists, Sum) :-
sum(Lists, 0, Sum).
sum([], Sum, Sum).
sum([[_,N]| Lists], Sum0, Sum) :-
Sum1 is Sum0 + N,
sum(Lists, Sum1, Sum).
此版本使用累加器启用尾部递归定义。电话示例:
| ?- sum([[a, 1], [b, 2], [c, 3], [d, 4]], Sum).
Sum = 10
yes
每当你期望成功的目标失败时,将此视为学习的机会(logic earn=earn logic的缩写)。毕竟,这就是Prolog,它的意思是用逻辑进行编程。那么,程序中的逻辑在哪里呢 目前你的程序失败了,但你希望它会成功。罪犯在哪里?让我们对您的程序进行概括,使生成的程序仍然失败,但要小得多。概括程序有两种简单的方法:
- 删除目标(通过添加前缀
)*
- 删除术语(将
替换为术语
术语*/
?- sum(Os, Total).
Os = [], Total = 0
; false.
,只有一个解。甚至没有一个求和([| | |,Total)的解
因此,让我们再次概括该计划,但现在关于这个失败的目标:
sum([], _sum([\uu,Tail],Sum2)
是罪魁祸首:它是一个正好包含两个元素的列表,但规则至少需要三个元素
有关实际修复,请参阅其他答案
此方法适用于像您这样的纯单调程序。
sum([[[uu,Head].[[uu,Tail]],sum)
->这表示它只匹配一个包含两个项目的列表,而不匹配其他项目。整个尾部部分需要一个名称。这个问题是昨天提出的,这里有一个答案:如果答案是你想要的。回答者是对的:这是一个很好的学习机会。但简单的答案是:你说了[\uu,tail]当您指的是Tail时。列表的其余部分不是两个要称为u和Tail的项,而是三个项,最好统称为Tail。findall/3
+member/2
将为您的item2list/2
谓词提供一个显著更快的实现,但是findall/3
会干扰约束。maplist/3
solu这个问题不存在。
| ?- sum(Xs, Sum).
Xs = []
; Xs = [_A,_B,_C].
?- sum(Os, Total).
Os = [], Total = 0
; false.
sum([], _