写Prolog有序谓词

时间:2018-04-27 03:50:50

标签: prolog

我正在尝试编写一个谓词,当且仅当列表中的数字处于非递减顺序时才会成功。我很难想到这一点。我知道,如果每个元素都小于或等于前一个元素,那么它应该返回false,但我对如何做到这一点感到迷失。

ordered(L) :- 

2 个答案:

答案 0 :(得分:0)

递归应该是您首先考虑接近Prolog中的任何问题。这意味着:

  1. 定义基本案例,您可以轻松确定谓词是真还是假

  2. 在其他情况下,将问题分成几部分 - 一部分可以立即解决,另一部分可以递归解决。问题的这些部分通常对应于列表的部分。

  3. 在最简单的情况下,递归逻辑只是将一些测试应用于列表的第一个元素;如果它通过,则递归地将谓词应用于列表的其余部分。

    在你的情况下,我认为它有点复杂,因为你没有任何有意义的方法可以测试单个元素的有序性(也许这会给你一个基本情况的提示......)。

答案 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]).