我被问到这个问题:
定义一个谓词ordered/1,它检查整数列表是否正确地按升序排列。例如,目标
ordered([1,3,7,11])
应该成功,目标也应该成功,ordered([1,3,3,7])
而目标ordered([1,7,3,9])
应该失败。
到目前为止,我有这个:
ordered([]).
ordered([N, M|Ns]):-
append(M, Ns, Tail),
ordered(Tail),
N =< M.
但它在每个列表上都失败了。
我推断它失败的原因是因为它到达列表中的末尾编号,然后尝试将该编号与空列表进行比较。显然这会失败,因为您无法将整数与空列表进行比较。即使您可以并且它返回0
一个空列表,它仍然会返回 false,因为该数字将大于0
,而不是小于。
我找不到解决方案...有什么想法吗?谢谢,乔恩。
编辑
所以,一些稍微修改的代码:
ordered([]).
ordered([N]):-
N >= 0.
ordered([N, M|Ns]):-
append(M, Ns, Tail),
ordered(Tail),
N =< M.
这现在适用于ordered([1])
,但更大的列表仍然无法正确运行。
我应该ordered([N, M|Ns])
在定义中包含类似的内容吗?