如何制作检查公司排名的递归列表?

时间:2011-01-09 17:41:58

标签: list recursion prolog

我有一组排名靠前的公司。我希望我的规则检查指定列表中的公司是否按排名顺序,并且规则重复,直到列表中的所有公司都被检查。

我目前有以下内容:

isOrder([]).
isOrder([COM1,COM2|T]) :-
    rank(COM1,D), rank(COM2,E),
    D<E,
    print("in order"),
    isOrder([COM2|T]).

但是,这似乎不起作用。有时,递归会一直持续而不会结束,有时递归根本不起作用。这是我改变代码以尝试获得正确答案的时候。

任何人都可以帮助我吗?我刚开始Prolog,我对它的理解非常有限。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

问题是你的程序没有单元素列表的情况:第一个案例处理空列表,而第二个案例只匹配一个包含两个或更多元素的列表。

您需要添加一个子句

isOrder([_]).

答案 1 :(得分:0)

在Prolog中,为递归提供正确的“基础”案例非常重要,并且正确地获取递归规则。

在这里,我想你想要将基本情况从isOrder([])改为isOrder([_]),或者可能同时拥有这两种情况。

你现在拥有的第一个子句看起来会为空列表返回true,我猜这没什么坏处。但是第二个子句永远不能将非空列表减少为空列表。它仅适用于包含至少两个项目(公司)的列表,并将此类案例减少为至少包含一个项目的列表。

因此,添加另一个子句isOrder([_]),如果列表只有一个项目,则表示您成功,并告诉我们它是如何工作的!