在prolog中到达列表的末尾

Jon*_*onB 5 recursion list prolog

我被问到了这个问题:

定义谓词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.
Run Code Online (Sandbox Code Playgroud)

但它在每个列表上都失败了.

我推断它失败的原因是因为它到达列表中的结束编号然后尝试将该数字与空列表进行比较.显然这会失败,因为您无法将整数与空列表进行比较.即使你可以,并且它,例如,返回0一个空列表,它仍将返回false,因为数字将大于0,不小于.

我找不到解决方案......有什么想法吗?谢谢,乔恩.


编辑

所以,一些略微修改的代码:

ordered([]).
ordered([N]):-
    N >= 0.
ordered([N, M|Ns]):-
    append(M, Ns, Tail),
    ordered(Tail),
    N =< M.
Run Code Online (Sandbox Code Playgroud)

这现在适用ordered([1]),但更大的列表仍然无法正常运行.

我应该ordered([N, M|Ns])在定义中包含类似内容吗?

Mar*_*wis 5

(假设这是作业,我不愿意提供完整的解决方案).

查看您的代码,尝试找出它将如何统一?- ordered([1]). 在心理上运行此查询(或使用trace/0)并查看它的作用,一步一步,以及它如何计算其结果.

另外,在思考prolog时,请尽量让"回报一个价值".Prolog谓词不会返回任何内容.


Jon*_*onB -2

好吧,最终,解决这个问题非常容易。

这是正确的代码。

ordered([]).

ordered([N, M|Ns]):-
 append([M], Ns, Tail),
 ordered(Tail),
 N =< M.

ordered([M]).
Run Code Online (Sandbox Code Playgroud)

订购([M])。如上所述处理单元素列表。

我的问题的真正根源是没有在追加函数中的 M 周围包含 [] 。

授予正确答案的礼仪是什么?你们俩都帮了很大的忙。

乔恩