Using Prolog withUsing Prolog with AllegroGraph 7.1.0 AllegroGraph 7.1.0

介绍

如果您不熟悉Prolog,我们建议您完成本教程,然后如果需要更多详细信息,请研究Allegro Prolog文档。 Lisp参考中记录了AllegroGraph中的prolog运算符。 关于使用SPARQL和使用Prolog进行查询之间的区别的注释可以在SPARQL参考中找到。

这是有关如何将Prolog与AllegroGraph 7.1.0一起使用的基本教程。 它足以使您前进,但是如果您有任何疑问,请联系Franz支持以寻求帮助。 在本教程中,我们将主要集中于如何使用以下构造:

因为Prolog查询可用于评估任意Lisp代码,所以执行Prolog查询需要eval权限。 WebView文档中的“管理用户”一节中讨论了用户权限。

Prolog符号

在查阅参考指南时,应该了解记录Prolog谓词的惯例(Prolog谓词运算符,也称为函子)。 在这里,我们重复在《参考指南》中所说的一些内容,并添加一个示例。

Prolog谓词调用(使用Lisp语法)看起来像常规的Lisp函数调用。 将该谓词命名为列表中的第一个元素,其余元素作为自变量的符号。 但是Prolog谓词调用的参数可以作为调用的输入提供,也可以不提供(指定为变量而不是值),以便该子句可以通过将某些数据统一为来返回该参数的可能值。 可以是包含地面数据和Prolog变量的节点树,如下例所示。 因此,我们必须在谓词文档中区分必须用值指定的参数,必须是变量的参数和可以是两者的参数。 我们将在一个示例之后描述这样做的表示法,以显示通过指定值或变量表示的含义。

下面的示例使用谓词append,该谓词append具有三个参数,并且对于第三个参数与附加的前两个参数相同的任何解决方案均成功。 关于Prolog语义的非凡之处在于,append是一种声明性关系,无论将哪些参数作为输入(值)提供,将哪些参数作为输出(指定为变量)使用,声明性关系都有效。 该示例使用Prolog解释器。 结果一次显示一次。 <ret>,指示用户按Return键,如果没有,则使Prolog查找下一个结果;如果没有,则打印No。 名称以?开头的符号 是变量。 (此示例使用简单的表达式来说明Prolog调用,而我们所说的可以将参数指定为值或变量的意思。与AllegroGraph关联使用的调用更为复杂,通常返回结果三元组列表,而不是一次返回一个结果。)

    > (?- (append (1 2) (3) ?z))  ;; Asks what values of ?z  
                                  ;; will satisfy the call  
    ?z = (1 2 3)  
    <ret>  
    No.  
                                  ;; Only ?z = (1 2 3) works.  
 
    > (?- (append (1 2) ?y (1 2 3))) ;; Asks what values of ?y  
                                     ;; will satisfy the call  
    ?y = (3)  
    <ret>  
    No.                              ;; Again, only one possibility  
 
    > (?- (append ?x ?y (1 2 3)))    ;; What values of ?x and ?y  
                                     ;; will work? There are four  
                                     ;; possibilities:  
    ?x = ()  
    ?y = (1 2 3)  
    <ret>  
    ?x = (1)  
    ?y = (2 3)  
    <ret>  
    ?x = (1 2)  
    ?y = (3)  
    <ret>  
    ?x = (1 2 3)  
    ?y = ()  
    <ret>  
    No.                    ;; And no more  
 
    > (?- (append ? (1 ?next . ?) (1 2 1 3 4 1 5 1)))  
    ?next = 2  
    <ret>  
    ?next = 3  
    <ret>  
    ?next = 5  
    <ret>  
    No. 

 

posted @ 2021-02-28 16:16  feifanren  阅读(64)  评论(0编辑  收藏  举报