【发布时间】:2020-11-17 14:14:21
【问题描述】:
我很难真正掌握对 Prolog 列表和递归调用的理解。我一直在开发一个程序来跟踪有多少项目大于列表的头部,然后递归调用这个关系来检查大于下一个元素等等。我已经让我的程序工作到可以计算大于头部的元素数量但是一旦它到达末尾并尝试递归调用下一个元素上的关系就会失败。根据我所做的研究,这就是我所拥有的以及我认为它应该如何工作:
Input - List = [7,2,4,3,6,9,8,10,12,5].
testHead(List).
testHead([H|T]) :-
greaterThan(H,T,0),
teastHead(T).
^我的理解是这种关系从列表中获取头部元素并使用头部和列表的其余部分调用大于。在greaterThan完成后,它应该递归调用testHead(T)来测试下一个元素等等。
greaterThan(H,[X|T],C) :-
H > X ->
C2 is C+1,
greaterThan(H,T,C2);
greaterThan(H,T,C).
^我这里的理解是在头元素、列表的其余部分和一个用于计数的变量中读取的大于。如果 head 大于下一个元素,则增加计数并使用 Tail 和新计数递归调用 greaterThan; else 在不增加计数的情况下递归调用greaterThan。
我的预期输出将是C2 = 12。 (7大于5个元素,2大于0元素,4大于1元素,以此类推)
当前的实际输出是5; 然后是false。
我的程序似乎正确地评估和增加了 head 元素,但是当它完成大于该元素时,程序返回 false。我已经尝试在 prolog 中研究和理解列表和递归调用,但我一直在碰壁。我不确定它是否会失败,因为您不能递归地运行增量关系,或者我的列表关系是否存在其他问题。任何有关如何解决此问题以及此处的 prolog 功能如何的说明都会有所帮助。
【问题讨论】:
标签: list recursion prolog counting