如何编写一个prolog查询,只从具有多个arities的事实中生成一个答案(例如下面的例子)?

时间:2015-01-24 21:54:03

标签: prolog

假设我正在编写prolog facts.pl文件,告诉我软件版本1.1在以下操作系统上升级到软件版本1.2(下面的示例)。 但是在查询时,我对操作系统的整个列表并不感兴趣,并且例如只是想查找是否支持'Solaris 10',我该如何编写这样的查询?

upgrades('1.1', ['Windows 2008 SP2', 'Windows 2008 R2', 'Windows 2008 R2 SP1', 'SuSE Linux 10', 'SuSE Linux 11', 'RHEL 5.5', 'RHEL 5.8', 'Solaris 10']).

现在我如何查询是否只能在Solaris 10上升级1.1到1.2?

1 个答案:

答案 0 :(得分:0)

Prolog有一个关系数据模型。所以同样的最佳实践'适用于数据设计,就像你在RDBMS中使用的那样(SQL,让我们说)

在可能的情况下,最好在符号和价值观之间建立小而明确的关系,而不是全部包含'作为你正在展示的人。

无论如何,假设你有另一个这样的事实

upgrades('1.2', ['Windows 2008 SP2', 'Windows 2008 R2', 'Windows 2008 R2 SP1', 'SuSE Linux 10', 'SuSE Linux 11', 'RHEL 5.5', 'RHEL 5.8', 'Solaris 10']).

然后?- can_upgrade(OS, From, To).可能

can_upgrade(OS, From, To) :-
  upgrades(From, L1), member(OS, L1),
  upgrades(To, L2), member(OS, L2).