复杂查询序言
Complex query prolog
是的,我只是想知道是否可以在 Prolog 中进行复杂查询。
我有一个包含许多属性的平板电脑的数据库。
tablet(Id, Name).
tablet_operating_system(Id, Operating_system).
tablet_release_year(Id,Release_Year).
tablet_screen_diagonal(Id, Diagonal).
等等...
嗯,我需要创建一个匹配不同条件的列表:
- Select 所有具有(Operating_system:ios 或 android)且(其 Release_Year 高于 2013)的平板电脑。
- Select 所有平板电脑(Screen_diagonal 超过 15 英寸且 Release_Year 超过 2013)或 Operating_system 是 ios.
- 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 将它们写成术语。这些条款是什么样子完全取决于你。
是的,我只是想知道是否可以在 Prolog 中进行复杂查询。
我有一个包含许多属性的平板电脑的数据库。
tablet(Id, Name).
tablet_operating_system(Id, Operating_system).
tablet_release_year(Id,Release_Year).
tablet_screen_diagonal(Id, Diagonal).
等等...
嗯,我需要创建一个匹配不同条件的列表:
- Select 所有具有(Operating_system:ios 或 android)且(其 Release_Year 高于 2013)的平板电脑。
- Select 所有平板电脑(Screen_diagonal 超过 15 英寸且 Release_Year 超过 2013)或 Operating_system 是 ios.
- 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 将它们写成术语。这些条款是什么样子完全取决于你。