我正在尝试编写一个谓词,当且仅当列表中的数字处于非递减顺序时才会成功。我很难想到这一点。我知道,如果每个元素都小于或等于前一个元素,那么它应该返回false,但我对如何做到这一点感到迷失。
ordered(L) :-
答案 0 :(得分:0)
递归应该是您首先考虑接近Prolog中的任何问题。这意味着:
定义基本案例,您可以轻松确定谓词是真还是假
在其他情况下,将问题分成几部分 - 一部分可以立即解决,另一部分可以递归解决。问题的这些部分通常对应于列表的部分。
在最简单的情况下,递归逻辑只是将一些测试应用于列表的第一个元素;如果它通过,则递归地将谓词应用于列表的其余部分。
在你的情况下,我认为它有点复杂,因为你没有任何有意义的方法可以测试单个元素的有序性(也许这会给你一个基本情况的提示......)。
答案 1 :(得分:0)
ordered(L) :- ordered2(L).
% empty list is ordered
ordered2([]) :- true.
% list with one element is ordered
ordered2([_]) :- true.
% list is ordered if two first elements are ordered
% and the rest of list is ordered
ordered2([A,B|T]) :- A=<B, ordered2([B|T]).