我目前正在使用输入生成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语句?
答案 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
应该代表的第一个参数?