Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 序言中位数_Prolog_Median - Fatal编程技术网

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),

我试图为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(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).