Prolog排序方法

Prolog排序方法,prolog,Prolog,伙计们,我对prolog示例有一个问题。我已经在我的数据库文件中写入了以下事实和规则,但我的数据库文件在编译时无法工作。你们知道吗? 我得到的错误是单例变量 ordered([B]). ordered(H|[H2|T]):- H=<H2, ordered([H2|T]). 有序([B])。 有序(H |[H2 | T]):- H=在子句中,“singleton variable”警告警告您 ordered([B]). 变量B只出现一次,即不用于绑定不同调用之间的值,即不起任

伙计们,我对prolog示例有一个问题。我已经在我的数据库文件中写入了以下事实和规则,但我的数据库文件在编译时无法工作。你们知道吗? 我得到的错误是单例变量

ordered([B]).
ordered(H|[H2|T]):-
   H=<H2,
   ordered([H2|T]).
有序([B])。
有序(H |[H2 | T]):-
H=在子句中,“singleton variable”警告警告您

ordered([B]).
变量
B
只出现一次,即不用于绑定不同调用之间的值,即不起任何作用。这通常是由于输入错误或忘记进行预期的更改,因此高层会发出警告。为了便于阅读而不触发警告,通常使用单例变量的方法是在其前面加下划线:
\u 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 | rest]

大多数递归规则有两种特殊/基本情况和一种一般情况

您有两个基本情况:

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.
ordered([A,B | C]):-%如果。。。
A=

您可能会注意到,这实际上不会对列表进行排序:它只会指示(通过
success
failure
)列表是否有序。

我的查询是有序的([1,2,3])。可能是有序的([H,H2|t]),而不是有序的(H|[H2|t])。谢谢您的回答。我解决了它。我写了“|”而不是第一行中的B。不要忘记
ordered([])
此问题特定于SWI。在符合ISO标准的系统(如SICStus或GNU)中,
有序(H |[H2 | T])
是无效的语法,无论
的运算符声明如何。