编辑:我想出了单例变量。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)).
如果您是经销商或从前任车主那里购买汽车,您可以成为汽车的车主。如果他们是从经销商或其他前任所有者那里购买的,则该前任所有者就是所有者。等等等等。所以它唯一停止的时间是这个人从经销商那里买车的时候。