复杂查询序言

Complex query prolog

是的,我只是想知道是否可以在 Prolog 中进行复杂查询。

我有一个包含许多属性的平板电脑的数据库。

tablet(Id, Name).
tablet_operating_system(Id, Operating_system).
tablet_release_year(Id,Release_Year).
tablet_screen_diagonal(Id, Diagonal).

等等...

嗯,我需要创建一个匹配不同条件的列表:

  1. Select 所有具有(Operating_system:ios 或 android)且(其 Release_Year 高于 2013)的平板电脑。
  2. Select 所有平板电脑(Screen_diagonal 超过 15 英寸且 Release_Year 超过 2013)或 Operating_system 是 ios.
  3. Select 所有具有(Release_Year 高于 2010 且不具有 Operating_system(windows))或(Release_Year 小于 2009和 Operating_system(windows)).

因此,如果可以创建具有不同条件和关键字的复杂查询,AND、OR、NOT。

我想它不能用一个查询来完成,但是对于许多查询来说是什么。如果我们有一些谓词可以跟踪当前平板电脑的列表。

例如,(find(operating_system(ios)); find(operating_system(android))), find(release_year(X), X>2013)将return一个列表,或者将列表放入某个谓词中。

或者像这样:

find(operating_system(ios), append).
find(operating_system(android), append).
find(release_year(X), X>2013, intersection).
print(cur_list).

我不需要谓词功能的实现方面的帮助,我需要找到最好的方式,如何使用,如何存储,以及在复杂查询后如何输出数据。如果有问题,我期待着回答您的问题。

这样的查询在 Prolog 中很容易完成。

Select 所有具有(OS:ios 或 android,且其 Release_Year 高于 2013 年的平板电脑。

setof(N, Id^OS^Y^(  tablet(Id, N),
            (  tablet_operating_system(Id, OS),
               member(OS, [iOS, android]),
               tablet_release_year(Id, Y),
               Y > 2013
            )
         ), Names).

Select 所有平板电脑(screen_diagonal 超过 15 英寸且 Release_Year 超过 2013)或 OS 是 iOS.

setof(N, Id^D^Y^(  tablet(Id, N),
            (  (  tablet_screen_diagonal(Id, D),
                  D > 15,
                  tablet_release_year(Id, Y),
                  Y > 2013
               )
            ;  tablet_operating_system(Id, iOS)
            )
         ), Names).

Select 所有具有(Release_Year 高于 2010 且不具有 OS(windows))或(Release_Year 小于 2009 AND OS(windows)).

setof(N, Id^OS^Y^(  tablet(Id, N),
            tablet_operating_system(Id, OS),
            tablet_release_year(Id, Y),
            (  (Y > 2010, OS \= windows)
            ;  (Y < 2009, OS = windows)
            )
         ), Names).

这些方法输出一个名称列表。如何使用,如何存储等,都取决于您的应用。但是在 Prolog 中,显示结果的一种常见方式是作为回溯的结果:

:- query(X, a, b, c).
X = w ;
X = t ;
...

如果你想通过回溯一次一个地处理其他谓词内部的结果,使用查询方法是个好办法。

或者,如上所述,作为一个排序的、不同的列表 setof:

:- setof(X, query(X, a, b, c), Xs).
Xs = [w, t, ...]

然后您可以将所有结果作为列表进行操作。

你需要澄清 store,但如果你想将这些结果作为某种事实保存到文件中,你会 assert 它们,如果你需要在会​​话之间保存它们,可以使用 Prolog 的文件 I/O 将它们写成术语。这些条款是什么样子完全取决于你。