Prolog 复杂查询序言
是的,我只是想知道是否有可能在Prolog中进行复杂的查询 我有一个具有许多属性的平板电脑数据库Prolog 复杂查询序言,prolog,predicate,complextype,Prolog,Predicate,Complextype,是的,我只是想知道是否有可能在Prolog中进行复杂的查询 我有一个具有许多属性的平板电脑数据库 tablet(Id, Name). tablet_operating_system(Id, Operating_system). tablet_release_year(Id,Release_Year). tablet_screen_diagonal(Id, Diagonal). 等等 我需要创建一个匹配不同条件的列表: 选择所有具有(操作系统:ios或android)和(发布年份在2013年以上
tablet(Id, Name).
tablet_operating_system(Id, Operating_system).
tablet_release_year(Id,Release_Year).
tablet_screen_diagonal(Id, Diagonal).
等等
我需要创建一个匹配不同条件的列表:
(find(操作系统(ios));find(操作系统(android));find(发布年份(X),X>2013)
将返回一个列表,或将列表放入某个谓词中
或者像这样:
find(operating_system(ios), append).
find(operating_system(android), append).
find(release_year(X), X>2013, intersection).
print(cur_list).
我不需要帮助实现谓词功能,我需要找到最好的方法,如何使用,如何存储,以及如何在复杂查询后输出数据。如果出现问题,我期待着回答您的问题。这样的查询在Prolog中很容易完成 选择所有具有以下功能的平板电脑(操作系统:ios或android,其发布年份在2013年以上) 选择所有具有(屏幕对角线大于15英寸,发布年份大于2013年)或操作系统为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).
选择所有具有(发布年份大于2010且没有操作系统(windows))或(发布年份小于2009且操作系统(windows))的平板电脑
如果希望通过回溯一次一个地处理其他谓词内部的结果,那么使用查询方法是很好的
或者,如上所述,作为带有setof
的已排序、不同的列表:
:- setof(X, query(X, a, b, c), Xs).
Xs = [w, t, ...]
然后可以将所有结果作为列表进行操作
您需要澄清存储,但如果您想将这些结果作为某种事实保存到文件中,您可以断言它们,如果您需要在会话之间保存它们,可以使用Prolog的文件I/O将它们写为术语。这些术语是什么样子完全取决于你。在你的第一个问题中,你真的是指iOS和Android制造商吗?或者你是说还是?第一个将导致空集。顺便说一句,iOS和Android不是制造商,而是操作系统@潜伏者,thnx,我的错误,刚刚编辑过。有一件事,
^
在一组谓词中是什么意思?@OlexiyPyvovarov它是一个存在量词。其目的是向setof
表明,您并不特别感兴趣根据所有其他变量的不同实例化来描述结果。您只关心收集变量N
。
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).
:- query(X, a, b, c).
X = w ;
X = t ;
...
:- setof(X, query(X, a, b, c), Xs).
Xs = [w, t, ...]