Prolog排序方法

时间:2015-03-10 19:10:35

标签: prolog

他们。我有关于prolog示例的问题。我已经将以下事实和规则写入我的数据库文件,但我编译它时我的数据库文件不起作用。你有什么想法吗? 我得到的错误是单例变量

ordered([B]).
ordered(H|[H2|T]):-
   H=<H2,
   ordered([H2|T]).

2 个答案:

答案 0 :(得分:0)

“单例变量”警告在条款

中警告您
ordered([B]).

变量B仅出现一次,即,不用于绑定不同调用之间的值,即,不能起作用。这通常是打字错误或忘记进行预期更改的结果,因此顶级会发出警告。在不触发警告的情况下使用单例变量以便于阅读的常用方法是在其前面添加下划线:_B

但这与您的代码的真正问题无关。单例变量不会引起任何问题,只是样式或印刷错误警告的方式问题。正如@ jol76指出的那样,代码的真正问题在于H|[H2|T]不是将列表的第一个匹配到元素并且它是尾部的正确表示法。符号为[H,H2|T]。我认为符号为[a,n,y,' ',n,u,m,b,e,r,' ',o,f,' ',e,l,e,m,e,n,t,s,' ',a,n,d|TheRest]

答案 1 :(得分:0)

大多数递归规则都有一些特殊/基本情况和一般情况。

您有两种基本情况:

ordered( [] ) . % the empty list is ordered
ordered( [_] ) . % a list consisting of a single item is ordered.

一般情况:

ordered( [A,B|C] ) :- % a list of two or more items is ordered, IF ...
  A =< B ,            % - the first item is less than or equal to the second
  ordered( [B|C] ).   % - if the remainder of the list (less its head) is also ordered.

您可能会注意到,这实际上并不会排序列表:它只会指示(通过successfailure)列表是否已订购