2011-04-04 114 views
0

我正在做一件大学课程作业,而我被一些Prolog卡住了。Prolog解析输出

课程是让一个非常基本的Watson(在Jeapoardy上回答问题的机器)。

无论如何,我已经成功地使它输出如下:

noun_phrase(det(the),np2(adj(traitorous),np2(noun(tostig_godwinson)))), 
verb_phrase(verb(was),np(noun(slain)))). 

但课程规定,我现在需要提取第一和第二个名词和动词,做一个更简洁的句子;即[Tostig_godwinson,被杀]。

我更喜欢C语言等编程语言,所以我有点卡住了。如果这是一种过程性语言,我会使用解析工具,但Prolog没有任何...我需要做些什么来提取这些部分?

预先感谢您

回答

0

在Prolog,语言解析工具。使用univ (=..) operator做长期的检查:

% find terminal nodes (words) in Tree 
terminal(Tree, Type, Item) :- 
    Tree =.. [Type, Item], 
    atomic(Item). 
terminal(Tree, Type, Item) :- 
    Tree =.. [_, Sub], 
    member(Node, Sub), 
    terminal(Node, Type, Item). 

现在得到的所有名词列表与findall(N, terminal(Tree, noun, N), Nouns)并获得nth1元素。

+0

嗨,我真的不明白... findall中的N是什么?我试图Google等,但它说这是一个对象... Prolog中没有对象... = S – Xenoprimate 2011-04-05 19:02:18

+0

@Migig:'N'只是一些变量。 'findall'收集所有'N',使'终端(树,名词,N)'在'名词'中。 – 2011-04-05 21:16:19