我正在尝试在DrRacket中运行此prolog代码: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之间的路径?
答案 0 :(得分:2)
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)?
等