Prolog功能(例如:汽车所有权历史)

时间:2013-03-16 17:31:10

标签: prolog singleton chain

编辑我找出了单例变量。 Prolog不喜欢数据库中的首字母。我也对代码进行了一些大的改动。

编辑:编辑:意识到我没有递归调用。 DERP

虽然我在使用Haskell进行函数式编程方面有一些经验,但我对Prolog很新。

虽然我在尝试使函数输出所有可能的值以使该语句成立时遇到问题。我不认为这是一个逻辑错误,因为我过去几个小时一直在走过它,但我可能是错的。

在这个问题上,我试图创建汽车的所有权历史记录。

- 我知道一个人拥有一辆车IF          - 他/她从经销商那里买了车          - 他/她从以前的车主那里买了它。

因此,了解这些事实后,我建立了一个数据库,创建汽车,所有者和经销商的单独变量,这将作为此递归的基本案例。

car(prius).
car(bmw).

owner(meg).
owner(nora).
dealer(d).

boughtFrom(meg,nora).
boughtFrom(nora,d).

我建立了从经销商处购买的诺拉购买的那个。当您从经销商处购买时,我计划停止递归,因为这是基本案例终点。 所以逻辑是这样的:

ownCar(X,Y) :- boughtFrom(X,d), car(Y).
ownCar(X,Y) :- ownCar(boughtFrom(_,prevowner(X)), car(Y)).

如果您是经销商或者您是从前车主那里购买汽车,您可以成为汽车的拥有者。并且如果先前的所有者是从经销商或其他所有者那里购买的,则该所有者是所有者。等等 所以它停止的唯一时间是当这个人从经销商处购买汽车时。

1 个答案:

答案 0 :(得分:0)

我认为您的数据库不完整,因为缺少一些明显的关系。

例如,ownCar(X,Y) :- boughtFrom(X,d), car(Y).这个规则对于所有 Y都是正确的,即从经销商处购买的任何人都将“拥有”每辆车。

表示也不准确。卖家出售汽车后,卖家不应该是车主。

无论如何,在Prolog中你编写 join (它是一个关系数据模型),然后得到传递属性的闭包:

ownCar(X, Y) :- owner(O), boughtFrom(X, O), ownCar(O, Y).

请注意,在Prolog中我们应该避免左递归,因为它可能导致无限循环,然后连接的顺序很重要。

修改

要获取历史记录(作为列表),您应该为谓词添加参数,或将“输出”更改为列表。你可以做点什么

ownCar(X, Y, [X]) :- boughtFrom(X,d), car(Y).
ownCar(X, Y, [X|L]) :- owner(O), boughtFrom(X, O), ownCar(O, Y, L).

注意:通常在Prolog中我们将'output'参数放在最后的参数位置。