【问题标题】:Prolog DCGs: Converting from programming notation to logical notationProlog DCG:从编程符号转换为逻辑符号
【发布时间】:2011-01-07 13:15:56
【问题描述】:

我正在尝试从这个符号转换:

A and (B or C) equ A and B or A and C)

到标准逻辑符号,例如and(A,B), or(A,B), neg(A)...

我认为我最好的方法是使用 DCG(我提出这个问题是因为我想练习 DCG)。任何想法为什么我的转换不起作用?到目前为止,我刚刚写了析取和得到变量的情况。我想要的答案应该是 or(atom(X),atom(Y))。

convert1(atom(X)) --> [X], {var(X)},!.
convert1(or(X,Y)) --> convert1(X), [or], convert1(Y).

test_convert1( F ) :-
   phrase( convert1( F ), [X, or, Y] ).

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

    test_convert1/1 中存在语法错误。它应该是

    test_convert1(F) :-
        phrase(convert1(F), [X, or, Y]).
    

    【讨论】:

    • 谢谢 larsman,真傻。但这并没有解决我的问题。将代码放在这里时,我只是犯了复制/粘贴错误。不过还是谢谢。
    • @imperial,那么哪个部分不起作用?我得到了输出X = or(atom(_G443), atom(_G449)),这正是我所期望的。如果您想在输出中看到XY,请不要使用var/1
    • 真的:S!你怎么称呼它?我想调用 test_convert1(F) 并让它输出你所说的内容。嗯,对不起,我可能在做一些非常愚蠢的事情。
    • 这取决于你想做什么。如果您需要在您的条款中使用 Prolog 变量进行进一步处理,那么您的代码就可以了。如果您想要漂亮的显示,请使用convert1(atom(X)) --> [X], {atom(X)}, !.xy 而不是XY
    • 嗯,我的意思是如果我可以test_convert(F).,那么我得到的答案是错误的。我没有得到任何逻辑表达式的输出。如果您得到答案,那么您一定对我的称呼不同吗?谢谢你的帮助:)。
    【解决方案2】:

    您的代码包含两个错误:

    1. 在第一个子句中,您没有从解析列表中读取 X
    2. DCG 中的切口应位于花括号之外。

    工作版本是:

    convert1(atom(X)) --> [X], {var(X)}, !.
    convert1(or(X,Y)) --> convert1(X), [or], convert1(Y).   
    

    【讨论】:

    • 您好,感谢您指出错误。由于某种原因,仍然没有答案。你介意看看吗?我认为它可能在 test_convert/1 中?
    猜你喜欢
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2013-02-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多