Я пытаюсь правильно отфильтровать значения, возвращаемые предложением (он возвращает несколько дублированных значений).Мне трудно понять логическое программирование, извините, если это глупый вопрос.
Это мои факты / предикаты:
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).
Что я пытаюсь сделать, это получитьназвание;условие состоит в том, что я должен получить только те, которые из определенного города, их дом является самым дорогим оттуда, но также, если второй самый дорогой дом из того же города стоит меньше, чем половина первого.Я не могу использовать списки.
Самые дорогие из каждого города:
home(peter, sanFrancisco, 1000).
home(juan, california, 700).
home(peter, vegas, 100).
Второй самый дорогой из каждого города:
home(juan, sanFrancisco, 400).
home(ash, california, 600).
home(ash, vegas, 80).
Что я ожидаю в результате:
peter.
То, что я пробовал до сих пор, но безуспешно ..
%Return the most expensive from each city.
theMostExpensive(Name, City):-
home(Name, City, Price),
fromEach(City, Price).
fromEach(City, Price):-
forall(home(_, City, Price2), Price>= Price2).
%Return the second most expensive from each city. Not sure if working correctly.
secondMostExpensive(Name, City):-
owner(home),
not(theMostExpensive(Name, City)),
theMostExpensive(Name2, City),
Name \= Name2.
%Return a lot of duplicated values and wrong..
superExpensive(Name):-
theMostExpensive(Name, City),
secondMostExpensive(Name2, City),
Name \= Name2,
City \= City2,
home(Name, City, Price),
home(Name2, City2, Price2),
Price > Price2 + (Price / 2).
Я думаю, что где-то в супердорогих делает что-то, как все * все?