Prolog函数(例如:汽车拥有历史)

Prolog函数(例如:汽车拥有历史),prolog,singleton,chain,Prolog,Singleton,Chain,编辑:我算出了单例变量。Prolog不喜欢数据库中的大写字母。我还对代码做了一些重大修改 编辑:编辑:意识到我没有递归调用。德普 虽然我在Haskell的函数式编程方面有一些经验,但我对Prolog还是相当陌生 尽管我在尝试使函数输出使语句为真的所有可能值时遇到困难。我不认为这是一个逻辑错误,因为在过去的几个小时里,我一直在讨论这个问题,但我可能是错的 在这个问题中,我试图创建汽车的所有权历史 -我知道一个人拥有一辆车,如果 -他/她从经销商那里买了车 -他/她从以前的车主那里买的 因此,了解这

编辑:我算出了单例变量。Prolog不喜欢数据库中的大写字母。我还对代码做了一些重大修改

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

虽然我在Haskell的函数式编程方面有一些经验,但我对Prolog还是相当陌生

尽管我在尝试使函数输出使语句为真的所有可能值时遇到困难。我不认为这是一个逻辑错误,因为在过去的几个小时里,我一直在讨论这个问题,但我可能是错的

在这个问题中,我试图创建汽车的所有权历史

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

因此,了解这些事实后,我建立了一个数据库,创建了汽车、车主和一个单独的经销商变量,这将作为递归的基本情况

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)).
如果你是经销商,或者你从以前的车主那里买的车,你可以成为车主。如果他们从经销商或其他前车主处购买,那么前车主就是车主。等等。
因此,它唯一停止的时间是当该人从经销商处购买汽车时。

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

例如,此规则ownCarX,Y:-boughtFromX,d,carY。所有Y都是如此,即从经销商处购买的任何人都将“拥有”每辆车

这种说法也不准确。卖车的人卖了车以后不应该再做车主了

无论如何,在Prolog中,您编写了连接,它是一个关系数据模型,然后要得到传递属性的闭包:

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中,我们将“输出”参数放在最后一个参数位置

感谢您的回复和宝贵的时间。好吧,我更了解递归问题。但我试图通过该函数实现的是将以前所有者的姓名显示出来。那么当我输入时?-ownCarX,Prius。它输出X=兆欧。X=诺拉。现在我得到梅格只是因为她是现在的主人。所以我想这个函数应该改名为carOwnerHist