Я пытаюсь найти / понять другой способ достижения результата путем вызова большего количества предикатов в предложении при использовании менее свободных переменных.
Исходя из этого проблемного Как правильно отфильтровать предложение, которое возвращает несколько дублированных значений? Я хотел попытаться достичь того же результата, добавив небольшую сложность.
Facts:
home(peter, sanFrancisco, 1000).
home(ash, sanFrancisco, 100).
home(juan, sanFrancisco, 400).
home(juan, california, 700).
home(ash, california, 600).
home(peter, california, 500).
home(peter, vegas, 100).
home(ash, vegas, 80).
home(juan, vegas, 60).
townHomesTotalCost(sanFrancisco, 1500).
townHomesTotalCost(california, 1800).
townHomesTotalCost(vegas, 240).
Ответ, предоставленный в предыдущем вопросе, был очень полезным, и я хотел попробовать что-то другое, чтобы лучше понять логическое программирование. Допустим, вместо цены на жилье я хочу сравнить в процентах. Для процента, который я создал этот пункт:
townHomeCostByPercentage(Name, Town, Percentage):-
home(Name, Town, Price),
townHomesTotalCost(Town, Total),
Percentage is round(((Price * 100) / Total)).
Получение самого дорогого дома в городе таково, что ни один другой дом в этом городе не стоит дороже его (допустим, я не хочу использовать цену в качестве входной переменной):
most_expensive(Name, Town):-
home( Name, Town, Price),
not((home( _, Town, P), P > Price)).
Второй самый дорогой дом в городе такой, который является самым дорогим среди домов, которые не являются самым дорогим домом в этом городе:
second_most_expensive(Name, Town):-
most_expensive(Name, Town),
home(Name, Town, Price),
home(_, Town, Price2), Price < TopPrice,
not((home(_, Town, P), P < TopPrice, P > Price)).
Я не могу понять, почему это дает тот же результат, что и most_expensive(Name, Town)
И, наконец, используя процент, возвращаем Имя, но сравниваем процент в том смысле, что самый_дорогой <, чем второй_мост_дорогой + 20: </p>
top_house_owner(Name) :-
most_expensive(Name, T),
townHomeCostByPercentage(Name, T, TopPercentage),
second_most_expensive(_, T),
townHomeCostByPercentage(_, T, Percentage),
TopPercentage < Percentage + 20.
Это также возвращает имя результата most_expensive(Name, Town)
и не может понять, почему.