我试图通过使用较少的自由变量时在子句中调用更多谓词来寻找/理解获得结果的另一种方法。
出于这个有问题的How to correctly filter a clause that returns multiple duplicated values?的考虑,我想尝试达到相同的结果会增加一些难度。
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)).
在一个城镇中获得最昂贵的房屋,使得该镇中没有其他房屋比它更昂贵(让我说我不想使用Price作为输入变量):
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)
相同的结果
最后,使用百分比返回Name,但比较百分比,因为most_expensive比 这还会返回结果名称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)
,但无法找到原因。