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年以上

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

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

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

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

  • 选择所有具有(操作系统:ios或android)和(发布年份在2013年以上)的平板电脑
  • 选择所有具有(屏幕对角线大于15英寸,发布年份大于2013年)或操作系统为ios的平板电脑
  • 选择所有具有(发布年份大于2010且没有操作系统(windows))或(发布年份小于2009且操作系统(windows))的平板电脑
  • 因此,如果可能的话,可以创建具有不同条件和关键字的复杂查询

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

    例如,
    (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, ...]