我有一组排名靠前的公司。我希望我的规则检查指定列表中的公司是否按排名顺序,并且规则重复,直到列表中的所有公司都被检查。
我目前有以下内容:
isOrder([]).
isOrder([COM1,COM2|T]) :-
rank(COM1,D), rank(COM2,E),
D<E,
print("in order"),
isOrder([COM2|T]).
但是,这似乎不起作用。有时,递归会一直持续而不会结束,有时递归根本不起作用。这是我改变代码以尝试获得正确答案的时候。
任何人都可以帮助我吗?我刚开始Prolog,我对它的理解非常有限。任何帮助将不胜感激。
答案 0 :(得分:1)
问题是你的程序没有单元素列表的情况:第一个案例处理空列表,而第二个案例只匹配一个包含两个或更多元素的列表。
您需要添加一个子句
isOrder([_]).
答案 1 :(得分:0)
在Prolog中,为递归提供正确的“基础”案例非常重要,并且正确地获取递归规则。
在这里,我想你想要将基本情况从isOrder([])改为isOrder([_]),或者可能同时拥有这两种情况。
你现在拥有的第一个子句看起来会为空列表返回true,我猜这没什么坏处。但是第二个子句永远不能将非空列表减少为空列表。它仅适用于包含至少两个项目(公司)的列表,并将此类案例减少为至少包含一个项目的列表。
因此,添加另一个子句isOrder([_]),如果列表只有一个项目,则表示您成功,并告诉我们它是如何工作的!