2011-01-09 11 views
0

我有一套排名顺序的公司。我希望我的规则能够检查指定列表中的公司是否按排名顺序排列,以及规则是否重复,直到列表中的所有公司都已经过检查。如何制作检查公司排名的递归列表?

目前,我有以下几点:

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

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

任何人都可以帮助我吗?我刚开始使用Prolog,我的理解受到严重限制。任何帮助将不胜感激。

回答

0

在Prolog它有递归右边的“基地”的情况下,以及获得的递归自身权利的规则是很重要的。

在这里,我想你想的基本情况,从isOrder([])来isOrder改变([_]),或许有这两种。

你拥有的第一条现在看起来像它会为一个空列表,我想没有任何伤害返回true。但是第二个条款永远不能将非空列表减少为空列表。它只适用于至少有两个项目(公司)的列表,并将这种情况缩减为至少包含一个项目的列表。

所以,增加一个条款isOrder([_]),它说你成功了,如果列表中只有一个项目,并让我们知道它是如何工作!

+1

不仅为空单的条款“不伤害”,它匹配(逻辑)的真理,一个空列表(平凡)订购。 – 2011-01-09 18:49:40

1

的问题是,你的程序有一个元素的列表中没有的情况:第一种情况处理空列表,而第二只匹配与两个或多个元素的列表。

你需要添加一个条款

isOrder([_]).