【问题标题】:Asking DCG Prolog for an answer向 DCG Prolog 寻求答案
【发布时间】:2015-07-07 07:59:47
【问题描述】:

我有一个用 prolog 编写的 DCG,它试图将字符串转换为简单的命题逻辑。

目前的规则是: + 表示 OR,* 表示 AND,- 表示 NOT

g(or(X,Y)) -->
    f(X),
    "+",
    g(Y).
g(X) -->
    f(X).

f(and(X,Y)) -->
   e(X),
   "*",
   f(Y).
f(X) -->
   e(X).

e(not(X)) -->
   "-",
   d(X).
e(X) -->
   d(X).

d(X)-->
   "(",
   g(X),
   ")".    
d(a)-->
   "a".
d(b)-->
   "b".

但是我遇到了Out of local trace 错误的问题。

这段代码应该是正确的,但是我如何让Prolog给and(not(or(a,b)),or(b,not(a)))作为-(a+b) * (b + -a)的答案

【问题讨论】:

  • 您可以使用您的语法生成所有句子,如下所示:?- length(L,N), phrase(g(X), L).

标签: prolog swi-prolog dcg


【解决方案1】:

您的语法看起来不错,但您忘记处理/跳过空格

?- phrase(g(X), `-(a+b)*(b+-a)`).
X = and(not(or(a, b)), or(b, not(a))) ;
false.

(注意:我已经手动删除了所有空格,并使用 SWI-Prolog 扩展作为代码文字列表。)

【讨论】:

  • ?- 短语(g(X), -(a+b)*(b+-a))。错误:语法错误:操作员预期错误:短语(g(X),-(a+b)*( ERROR: ** here ** ERROR: b+-a))。
  • 你使用了哪些扩展?
  • 我的意思是输入周围的反引号 - 你可以在我的帖子中看到它们......否则,使用?- atom_codes('-(a+b)*(b+-a)',Cs), phrase(g(X), Cs).
  • @JoséValente:请注意,使用 ` 是特定于 SWI 的。所有其他系统要么拒绝这一点,要么以不同的方式解释这一点。因此::- set_prolog_flag(double_quotes, codes). 并将" 用于phrase/2。这适用于任何地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多