有没有一种方法可以使用较少的变量在子句中达到相同的结果?

时间:2019-06-16 01:05:38

标签: prolog

我试图通过使用较少的自由变量时在子句中调用更多谓词来寻找/理解获得结果的另一种方法。

出于这个有问题的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),但无法找到原因。

0 个答案:

没有答案