【问题标题】:Transitive function in DCGDCG中的传递函数
【发布时间】:2016-11-28 01:05:16
【问题描述】:

是否可以在 DCG 中制作如下传递函数?或者将其与 DCG 规则结合起来?

genx(A,B) :- gen(A,B).
genx(A,C) :- gen(A,B), genx(B,C).
gen(a,b).
gen(b,c).

我将解释我正在尝试做什么:

如果我有这个语法:

noun_phrase(D,N) --> det(D), noun(N).
noun(n(cat)) --> [cat].

我想做一些限制,比如我想让noun(N) 中的N 成为动物。所以我可以使用这样的东西:

noun_phrase(np(D,N)) --> det(D), noun(N), genx(N, animal).

如果猫是动物的信息是从以下事实推断出来的:

gen(cat,pet).
gen(pet,animal).

谢谢

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

    不确定是否理解。

    如果我没记错的话,从形式上看规则

    genx(A,B) :- gen(A,B).
    genx(A,C) :- gen(A,B), genx(B,C).
    

    可以用 DCG 语法写成

    genx --> gen.
    genx --> gen, genx.
    

    根据事实,

    gen(a, b).
    gen(b, c).
    

    genx(a, c) 应该返回 true。

    但是,DCG 中的ABC 旨在列出。

    我不知道以这种方式使用 DCG(用于解析)来实现代数规则是否合理。

    【讨论】:

    • 感谢您的回答,但它似乎不起作用!你能给出更明确的答案吗?
    • @user2598997 - 你用的是哪个序言?我看到它与 gprolog 和 swi-prolog 一起工作。如果不是列表有问题,可以尝试更改gen([a], [b]).gen([b], [c]).中的事实; genx([a], [c]) 应该返回 true。
    • 我正在使用 swi-prolog(在线 vserion)。 genx(A, B) --> gen(A, B)。 genx(A, C) --> gen(A, B), genx(B, C)。根([a],[b])。根([b],[c])。给出这个错误:过程 `genx(A,B)' 不存在。
    • @user2598997 - 看看我的回答;如果使用 DCG,则必须删除这两个参数;所以genx --> gen, genx.,而不是genx(A, C) --> gen(A, B), genx(B, C).
    • 感谢您的回答,但如果我不能使用参数,这在我的情况下没有用,我将无法像上面的示例中那样执行 genx(N, animal)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2018-06-26
    • 2016-02-03
    • 2012-11-04
    • 2011-04-16
    • 2015-05-02
    相关资源
    最近更新 更多