用Prolog中的变量替换术语

时间:2012-04-09 19:44:03

标签: prolog dcg

我在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解决方案。

谢谢。

1 个答案:

答案 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([_|_],_).