我在Prolog中有一个DCG,我可以像这样查询:
q(Tree, [name, of, company], []).
并获得一个响应,显示解析查询所采用的路径:
Tree = q(['company (Class)', 'name (Attribute)'])
现在我想提出一个查询,例如:
q(Tree, [name, of, acme], []).
并且未能匹配术语acme
,我想创建一个变量Acme
,以便我得到类似的内容:
Acme = company Tree = q(['company (Class)', 'name (Attribute)'])
我正在使用SWI-Prolog并从另一种语言查询它,这就是查询全部小写的原因。我的另一个选择是创建所有有效术语的词典,并用变量替换查询中的所有unknows,但我希望有一个Prolog解决方案。
谢谢。
答案 0 :(得分:1)
我是否正确理解您需要所有基于前缀的列表?以下是否适合您:
1 ?- p([name,of,company],L).
L = [name, of, company] ;
L = [name, of|_G456] ;
L = [name|_G453] ;
true.
2 ?- p([name,of,department,of,company],M).
M = [name, of, department, of, company] ;
M = [name, of, department, of|_G551] ;
M = [name, of, department|_G548] ;
M = [name, of|_G545] ;
M = [name|_G542] ;
true.
如果这是预期的行为,那么实现它的代码可以是
p([],[]).
p([X|Xs],[X|Ys]) :- p(Xs,Ys).
p([_|_],_).