Prolog排序方法
伙计们,我对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只出现一次,即不用于绑定不同调用之间的值,即不起任
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])
是无效的语法,无论
的运算符声明如何。