Есть ли способ достичь того же результата в предложении, используя меньше переменных? - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь найти / понять другой способ достижения результата путем вызова большего количества предикатов в предложении при использовании менее свободных переменных.

Исходя из этого проблемного Как правильно отфильтровать предложение, которое возвращает несколько дублированных значений? Я хотел попытаться достичь того же результата, добавив небольшую сложность.

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) и не может понять, почему.

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