如果在prolog中使用语言树语句

时间:2015-02-17 19:28:27

标签: if-statement tree prolog

我目前正在使用输入生成prolog树,例如:

the flight flew.

其树看起来像这样:

s(the, np(flight), vp(flew))

在我生成所述树后,我试图检查,在这种情况下,"""事实上""。还有另一种情况可能是"做了#34;。

据我所知,prolog if语句的格式如下:

( IF -> THEN; ELSE ),

我试图这样做:

( s(the, A, B)) -> assert(Tree); do_something_else ),

但是当我这样做时,我无法运行该程序。我如何在if语句中询问树中的特定值?我是否正确地做了if语句?

1 个答案:

答案 0 :(得分:0)

您需要能够提供有关尝试运行实际程序时实际发生情况的有用信息。换句话说,了解如何提供minimal, complete, and verifiable example

如果您在显示它的术语中有“树”,那么您只需要在头部使用模式匹配(统一)来检查s/3的第一个参数是否为{{1 }或the

did

这可能比使用if-then-else结构更好。如果你坚持,你将不得不说:

foo(s(the, A, B)) :- /* do some stuff */.
foo(s(did, A, B)) :- /* do other stuff */.

这里的要点是if-then-else中的条件必须是被评估的东西,要么成功要么失败:你不能像在谓词的头部那样使用模式匹配。编写条件的另一种迂回方式是使用arg/3

之类的东西
T = s(Foo, A, B),
(   Foo == the
->  /* do something */
;   Foo == did
->  /* do something else */
;   /* anything else */
)

但令我困扰的是,在解析之后,您最终会得到一篇文章( arg(1, T, the) -> /* ... */ ; arg(1, T, did) -> /* ... */ ; /* ... */ ) 或动词the。句子的哪一部分是did应该代表的第一个参数?