我只是参与使用 Prolog 来处理不仅仅是最简单形式的数据(事实),并且正在寻找经验丰富的 Prologers 的一些指导......
如果我想动态管理数据或事实,我有几个主要的选择,例如:
- 在 Prolog 中将数据作为断言进行管理,或者
- 从 Prolog 到数据库的接口,或者
- 可能是两者的结合
如果我在 Prolog 中将事实作为断言来管理,那么我还有一个问题是表示这些事实的最佳方式。假设我有一个person
有名字、姓氏和年龄的人。我可以断言它为:
person(first_name(_), last_name(_), age(_)).
或者对 person 的属性有一个隐含的假设:
person(_, _, _). % first name, last name, age
如果我想将一个人与其他事物联系起来,我真的需要一个人的钥匙。所以我可能倾向于断言一个人为:
person(id(_), ...). % Maintain id as a uniq person key; or done implicitly as above
当然,现在我让我的 Prolog 断言看起来像关系数据库表条目。这让我想知道我是否采取了错误的方法并使事实的表达过于复杂。
所以真的,我的问题是:在 Prolog 中管理中到复杂数据时,是否有一些最佳实践需要考虑?命名约定是它的一小部分。我读过像 Prolog 中的断言/撤回这样的位是低效的。因此,我还想知道如何处理数据组织本身,例如何时使用外部 SQL 数据库与仅使用 Prolog 表示。
附录
我会假设由于关系数据库使用它们的原因,像在关系数据库中所做的那样,对记录使用键是可取的。这意味着必须维护密钥。对于每种情况,在 Prolog 中手动(显式)执行此操作似乎很麻烦,那么这通常是如何完成的呢?还是我的假设正确?