Prolog 序言中位数
我试图为prolog编写规则,通过使用分区方法定义列表的中间值Prolog 序言中位数,prolog,median,Prolog,Median,我试图为prolog编写规则,通过使用分区方法定义列表的中间值 partition([], V, [], []). partition([X | L], V, [X | A], B) :- (V > X), !, partition(L, V, A, B). partition([X | L], V, A, [X | B]) :- (V < X), !, partition(L, V, A, B). partition([X | L], V, A, B) :- (V =:= X),
partition([], V, [], []).
partition([X | L], V, [X | A], B) :- (V > X), !, partition(L, V, A, B).
partition([X | L], V, A, [X | B]) :- (V < X), !, partition(L, V, A, B).
partition([X | L], V, A, B) :- (V =:= X), partition(L, V, A, B).
median([A], A).
median(L, M) :- partition(L, M, A, B), length(A, X), length(B, X).
分区([],V,[],[])。
分区([X | L],V[X | A],B):-(V>X)!,分区(L,V,A,B)。
分区([X | L],V,A,[X | B]):-(V
划分(L,V,A,B)
将列表L划分为两个子列表A和B,其中A的值小于V,B的值大于V
这部分很好,但当我试着写我的中位数时,我试图说它是一个中位数,在分割之后,a和B的长度相同
当我使用具体的值时,中位数起作用,比如中位数([1,2,3],2)
但是当我尝试中值([1,2,3],X)时。
它给出一条错误消息error:>/2:参数没有充分实例化
我想知道怎么解决这个问题?谢谢
=:=
运算符要求实例化其两个操作数。当您请求中值([1,2,3],X)
时,它的一个操作数变为X
,但尚未实例化。其他算术运算符(如>
)也存在同样的问题
要更正它,您可以使用约束编程(它提供了不太严格的算术运算符),也可以重新编写程序,只对列表元素使用算术运算。例如,尝试一种经典方法,如:对数字列表进行排序,然后将列表分为三个部分:长度为N的列表、单个元素、长度为N的列表。提示:排序后,只需使用一个
append/3
和两个length/2
调用即可完成这部分操作。让程序使用中值运行的简单方法([1,2,3],X)
query-是将M
实例化为上一个规则中L
的成员:
median(L, M) :-
member(M, L),
partition(L, M, A, B), length(A, X), length(B, X).