Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
List 排序症状表prolog_List_Prolog - Fatal编程技术网

List 排序症状表prolog

List 排序症状表prolog,list,prolog,List,Prolog,我有一个动态列表,其中包含一些具有确定值的症状 ES:[症状(a,0.93)、症状(b,0.56)、症状(c,0.59)、症状(d,0.80)] 我想根据确定性的值按降序排列列表 ES:[症状(a,0.93)、症状(d,0.80)、症状(c,0.59)、症状(b,0.56)] 谁能帮我?谢谢您使用的是哪种prolog环境?SWI_Prolog有一个谓词,它可以使用自定义谓词对列表重新排序。最快的方法通常是将列表映射到另一个列表,并使用键排序/2对其排序。在这里,我假设您也希望对名称进行排序,前提

我有一个动态列表,其中包含一些具有确定值的症状

ES:
[症状(a,0.93)、症状(b,0.56)、症状(c,0.59)、症状(d,0.80)]

我想根据确定性的值按降序排列列表

ES:
[症状(a,0.93)、症状(d,0.80)、症状(c,0.59)、症状(b,0.56)]


谁能帮我?谢谢

您使用的是哪种prolog环境?SWI_Prolog有一个谓词,它可以使用自定义谓词对列表重新排序。

最快的方法通常是将列表映射到另一个列表,并使用
键排序/2对其排序。在这里,我假设您也希望对名称进行排序,前提是它们具有相同的值

element_to_pair(E, k(NegV,N) - E) :-
   E = symptom(N,V),
   NegV is -V.

nigrosort(Xs, Ys) :-
   maplist(element_to_pair,Xs, Ks),
   keysort(Ks, Ls),
   pairs_values(Ls, Ys).
像这个
元素对/2
这样的小谓词通常不应该有自己的名称。太多了,记不住了。使用,您可以写得更简洁:

:- use_module(library(lambda)).

nigrosort(Xs, Ys) :-
   maplist(\E^(k(NegV,N)-E)^( E = symptom(N,V), NegV is -V ),Xs, Ks),
   keysort(Ks, Ls),
   pairs_values(Ls,Ys).
…,预排序(比较症状,L,有序)。。。
比较症状(PB)。
比较症状(>,,)。

请注意,我们必须避免返回相等,否则系统将以相同的概率删除症状。

如果使用ECLiPSe,可以使用
排序/4
谓词,该谓词允许指定用于排序的术语参数:

sort(2, >=, Symptoms, OrderedSymptoms)
sort(2, >=, Symptoms, OrderedSymptoms)