Prolog 等效规则,但有一个错误
Prolog equivalent rule but error in one
我目前正在为考试练习 Prolog,当我研究旧考试时遇到一个问题,其中必须定义一个 returns 列表长度的谓词。 (示例:lengthof([a,b,c,d,e,f],Length).
的计算结果为 Length=6.
)
我的方法如下:
lengthof([],0).
lengthof(List,LengthNew) :- lengthof([_|List],Length),LengthNew is Length-1.
但它总是抛出堆栈溢出错误。我不知道我做错了什么,所以我查看了解决方案。此问题的解决方案如下:
lengthof([],0).
lengthof([_|List],LengthNew) :- lengthof(List,Length),LengthNew is Length+1.
我现在想知道为什么我的方法没有奏效。这个有什么问题?从逻辑上看,我认为这两种方法是等价的。
lengthof([],0).
这个字符串表示空列表的长度为零。
lengthof([_|List],LengthNew) :-
lengthof(List,Length),LengthNew is Length+1.
在你说的规则中,没有空列表必须考虑作为第一个元素 (_) 和其他元素 (List)。 all 列表的长度是 "List" 加一。
但是在这条规则中:
lengthof(List,LengthNew) :-
lengthof([_|List],Length),LengthNew is Length-1.
你说初始列表的长度 ("List") 是更大列表的长度减一。
对于任何列表都是如此,但这不是您问题的解决方案,因为您的代码不会计算初始列表的长度 - 而不是不断地增加初始列表。
你的第一个处理空列表的规则描述了递归退出的条件。所以你的第二条规则必须减少列表的大小,但你尝试增加它,所以你收到 "stack overflow" 错误。
我目前正在为考试练习 Prolog,当我研究旧考试时遇到一个问题,其中必须定义一个 returns 列表长度的谓词。 (示例:lengthof([a,b,c,d,e,f],Length).
的计算结果为 Length=6.
)
我的方法如下:
lengthof([],0).
lengthof(List,LengthNew) :- lengthof([_|List],Length),LengthNew is Length-1.
但它总是抛出堆栈溢出错误。我不知道我做错了什么,所以我查看了解决方案。此问题的解决方案如下:
lengthof([],0).
lengthof([_|List],LengthNew) :- lengthof(List,Length),LengthNew is Length+1.
我现在想知道为什么我的方法没有奏效。这个有什么问题?从逻辑上看,我认为这两种方法是等价的。
lengthof([],0).
这个字符串表示空列表的长度为零。
lengthof([_|List],LengthNew) :-
lengthof(List,Length),LengthNew is Length+1.
在你说的规则中,没有空列表必须考虑作为第一个元素 (_) 和其他元素 (List)。 all 列表的长度是 "List" 加一。
但是在这条规则中:
lengthof(List,LengthNew) :-
lengthof([_|List],Length),LengthNew is Length-1.
你说初始列表的长度 ("List") 是更大列表的长度减一。 对于任何列表都是如此,但这不是您问题的解决方案,因为您的代码不会计算初始列表的长度 - 而不是不断地增加初始列表。
你的第一个处理空列表的规则描述了递归退出的条件。所以你的第二条规则必须减少列表的大小,但你尝试增加它,所以你收到 "stack overflow" 错误。