【问题标题】:Datalog code not working in DrRacket数据记录代码在 DrRacket 中不起作用
【发布时间】:2016-08-30 08:26:05
【问题描述】:

我正在尝试在 DrRacket 中运行此序言代码:http://www.anselm.edu/homepage/mmalita/culpro/graf1.html

#lang datalog

arc(a,b).
arc(b,c).
arc(a,c).
arc(a,d).
arc(b,e).
arc(e,f).
arc(b,f).
arc(f,g).   

pathall(X,X,[]).
pathall(X,Y,[X,Z|L]):- arc(X,Z),pathall(Z,Y,L).       % error on this line; 

pathall(a,g)?

但是,它给出了以下错误:

read: expected a `]' to close `['

我怀疑'|'符号未被读取为列表的头尾分隔符。此外,[] 也会出错(如果删除了后续行):

#%app: missing procedure expression;
 probably originally (), which is an illegal empty application in: (#%app)

如何更正这些问题,以便代码正常工作并搜索 a 和 g 之间的路径?

【问题讨论】:

    标签: prolog scheme racket datalog


    【解决方案1】:

    DrRacket 中的 Datalog 模块不是 Prolog 的实现,您使用的语法是不允许的(请参阅manual 了解允许的语法)。

    具体而言,不能是列表 ([]) 之类的数据结构。要运行上述程序,您需要一个带有数据结构的 Prolog 解释器。

    你可以做的是定义一个谓词path,就像你链接的例子一样:

    path(X,Y):- arc(X,Y).
    path(X,Y):- arc(X,Z),path(Z,Y).
    

    例如,询问路径是否存在,如:

    path(a,g)?
    

    或打印到某个节点的所有路径

    path(X,g)?
    

    等等

    【讨论】:

    • 如何将上述代码更改为正常工作的数据记录代码?
    • 不能,因为术语不能是列表。 DrRacket 中的 Datalog 模块是一个非常简单的模块,不等同于 Prolog,特别是它没有实现数据结构。您可以做的只是您链接的示例的第一部分,即测试路径是否存在,或打印路径。
    • 有没有办法在 Racket 旁边使用适当的 Prolog?
    • 我认为不是真正的 Prolog。 Prolog 是一种基于与 Scheme/Racket 完全不同的编程范式的语言,要使用正确的 Prolog,您需要一个特定的解释器(当然可以用 Scheme 编写)。例如,如果您想使用 Prolog,您可以从 SWI-Prolog 开始,这是一个免费且功能强大的实现。
    • 谢谢。顺便说一句,恭喜您获得 10K 声望。
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多