Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/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
prolog-findall排序并返回第一个_Prolog - Fatal编程技术网

prolog-findall排序并返回第一个

prolog-findall排序并返回第一个,prolog,Prolog,我有一些事实,例如: motherboard('name', price, 'price range', score). 我需要按分数选择最好的主板,所以我想我应该使用findall,但我不知道如何按分数排序(desc order)并选择第一个!你能帮我吗 编辑-@user27815解决方案: motherboard('Gigabyte B360M Aourus Gaming 3', 86, 'low_range', 3). motherboard('MSI B350M Mortar', 93

我有一些事实,例如:

motherboard('name', price, 'price range', score).
我需要按分数选择最好的主板,所以我想我应该使用findall,但我不知道如何按分数排序(desc order)并选择第一个!你能帮我吗

编辑-@user27815解决方案:

motherboard('Gigabyte B360M Aourus Gaming 3', 86, 'low_range', 3).
motherboard('MSI B350M Mortar', 93, 'low_range', 4).
motherboard('ASUS ROG Strix B350\u002DF', 114, 'middle_range', 6).
motherboard('MSI Z370 Tomahawk', 139, 'middle_range', 7).
motherboard('Gigabyte Aorus AX370 Gaming K7', 169, 'high_range', 8).

setof(Score-Nome,motherboard(Nome, Price,Price_range, Score),Pairs), sort(1,@>,Pairs,Sorted),
        write(Pairs),
        nl,
        write(Sorted).
结果是:[3千兆字节B360M Aourus Gaming 3]对于这两个对和排序,它以oud dot结尾,我可以按;要有更多的解决方案,为什么不一起打印呢?不管怎样,配对和排序的顺序是一样的

@保罗莫拉溶液- 使用与上一个解决方案相同的数据: 集合(分数Nome,主板(分数Nome,价格,价格范围,分数),配对),最后(配对,最佳主板), 写(最好的主板)

我明白了:

?- start.
3-Gigabyte B360M Aourus Gaming 3
true ;
4-MSI B350M Mortar
true ;
6-ASUS ROG Strix B350-F
true ;
7-MSI Z370 Tomahawk
true ;
8-Gigabyte Aorus AX370 Gaming K7
true.

使用标准的
setof/3
谓词而不是
findall/3
谓词将为您提供一个按升序排序的列表。然后,您可以遍历该列表以获取最后一个元素,即得分最高的主板。比如:

...,
setof(..., ..., Motherboards),
last(Motherboards, BestMotherboard).

last/2
谓词是一个常见的库谓词。

使用标准的
setof/3
谓词而不是
findall/3
谓词将为您提供一个按升序排序的列表。然后,您可以遍历该列表以获取最后一个元素,即得分最高的主板。比如:

...,
setof(..., ..., Motherboards),
last(Motherboards, BestMotherboard).
last/2
谓词是一个常见的库谓词。

给定:

motherboard('thing1', price, 'price range', 5).
motherboard('thing2', price, 'price range', 4).
motherboard('thing3', price, 'price range', 3).
motherboard('thing4', price, 'price range', 2).
motherboard('thing5', price, 'price range', 1).
我们可以查询:

?-setof(Score-Thing,motherboard(Thing,price,'price range',Scores),Pairs), sort(1,@>,Pairs,Sorted).
Pairs = [1-thing5, 2-thing4, 3-thing3, 4-thing2, 5-thing1],
Sorted = [5-thing1, 4-thing2, 3-thing3, 2-thing4, 1-thing5].
setof/3
对答案进行排序,但不是按照您想要的顺序,因此如果我们想要对整个列表进行排序,而不仅仅是对顶层核心进行排序,则需要使用
sort/4

或者,您可以定义一个反向谓词(将5转换为-5等),并将其包含在
setof/3
调用中,以避免“排序两次”,但随后需要重新创建排序列表以查看原始数字,如果任何值为负值,这将不起作用。

给定:

motherboard('thing1', price, 'price range', 5).
motherboard('thing2', price, 'price range', 4).
motherboard('thing3', price, 'price range', 3).
motherboard('thing4', price, 'price range', 2).
motherboard('thing5', price, 'price range', 1).
我们可以查询:

?-setof(Score-Thing,motherboard(Thing,price,'price range',Scores),Pairs), sort(1,@>,Pairs,Sorted).
Pairs = [1-thing5, 2-thing4, 3-thing3, 4-thing2, 5-thing1],
Sorted = [5-thing1, 4-thing2, 3-thing3, 2-thing4, 1-thing5].
setof/3
对答案进行排序,但不是按照您想要的顺序,因此如果我们想要对整个列表进行排序,而不仅仅是对顶层核心进行排序,则需要使用
sort/4



或者,您可以定义一个反向谓词(将5转换为-5等),并将其包含在
setof/3
调用中,以避免“排序两次”,但随后您需要重新创建排序列表以查看原始数字,如果任何内容的分数为负数,这将不起作用。

此列表如何按分数排序?无论如何,我试着这样做:设置(主板(Nome),主板(名称,价格,价格范围,分数),主板),最后(主板,最佳主板)。write(BestMotherboard),但我在写入时遇到了以下错误:子句正文中的句号?无法重新定义/2@Nicola在调用
last/2
之后,您有一个
。对,但仍然有一些问题,系统返回false@Nicola
setof/3
调用的第一个参数必须包含分数,以便可以获得按分数排序的列表。例如,
分数名称
。此列表如何按分数排序?无论如何,我试着这样做:设置(主板(Nome),主板(名称,价格,价格范围,分数),主板),最后(主板,最佳主板)。write(BestMotherboard),但我在写入时遇到了以下错误:子句正文中的句号?无法重新定义/2@Nicola在调用
last/2
之后,您有一个
。对,但仍然有一些问题,系统返回false@Nicola
setof/3
调用的第一个参数必须包含分数,以便可以获得按分数排序的列表。例如,
Score Name
。如果你在收集后进行排序,那么可以使用
findall/3
?@user27815在不排序的情况下进行收集。我已经用你的搜索结果编辑了第一篇帖子solution@PauloMoura提出的第一个解决方案是正确的,也是一个很好的观点,但是在我没有详细说明的第二个示例中,您仍然会使用
setof/3
。另外,应该注意的是
sort/4
既不是标准谓词,也不是公共库谓词。如果您在收集后进行排序,然后使用
findall/3
?@user27815在不排序的情况下收集。我已经用你的搜索结果编辑了第一篇文章solution@PauloMoura为第一个解决方案概述了这一点,这是正确的,也是一个很好的观点,但在第二个解决方案中,我没有详细说明,您将使用
setof/3
still。此外,需要注意的是,
sort/4
既不是标准谓词,也不是公共库谓词。您需要使用
setof(Score Nome,Price^Price_range^主板(Nome,Price,Price_range,Score),Pairs),sort(1,@>,Pairs,Sorted),write(Pairs),nl,write(Sorted).
以便在调用集合中忽略价格和价格范围。正如@user27815所指出的,您需要明确限定要忽略的第二个参数集合中的参数。这将为您提供一个单一的解决方案。您需要使用
setof(Score Nome,Price^ Price_range^主板(Nome,Price,Price_range,Score),Pairs),Sorted(1,@>,Pairs,Sorted),write(Pairs),nl,write(Sorted)。
以便在setof调用中忽略价格和价格范围。正如@user27815所指出的,您需要显式限定要忽略的
setof/3
第二个参数中的参数。这将给你一个单一的解决方案。