пролог - найти все сортировать и вернуть первый - PullRequest
0 голосов
/ 10 июня 2018

У меня есть несколько фактов, таких как:

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-Gigabyte B360M Aourus Gaming 3] как для пар, так и для сортировки, он заканчивается с точкой и я могу нажать;чтобы иметь больше решений, почему бы не распечатать их все вместе?И в любом случае порядок одинаков для пар и отсортирован

@ решение PauloMoura - с теми же данными предыдущего решения: setof (Score-Nome, материнская плата (Nome, Price, Price_range, Score), Pairs),последний (Пары, BestMotherboard), напиши (BestMotherboard).

Я получаю это:

?- 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.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Дано:

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, чтобы избежать «сортировки дважды», но выЗатем нужно будет перевернуть отсортированный список, чтобы увидеть исходные числа, это не сработает, если что-либо имеет отрицательный результат.

0 голосов
/ 10 июня 2018

Вместо стандартного предиката setof/3 вместо предиката findall/3 вы получите список, отсортированный по возрастанию.Затем вы можете пройти этот список, чтобы взять последний элемент, который будет материнской платой с лучшим результатом.Что-то вроде:

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

Предикат last/2 является распространенным предикатом библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...