【问题标题】:Prolog formula parserProlog 公式解析器
【发布时间】:2016-04-26 20:08:45
【问题描述】:

我必须编写一个谓词 parse(FIn, FOut),它采用包含序言操作数“+”、“”和“;”的逻辑公式作为参数 FIn 和包含“非”、“与”和“或”的逻辑公式,而不是作为参数 FOut 的序言操作数。如果 FIn 和 FOut 等价,则谓词必须返回 true。

例如 parse(+(a, b), not(and(a, b))) => true

要检查公式是否被否定,我可以写

parse(FIn, FOut) :- isNeg(FIn, FOut).
isNeg(\+(F1), not(F2)).

但现在我不知道如何检查 "," 和 "and" 和 ";"和“或”。 如果有人有一些提示,那就太好了。

【问题讨论】:

  • 类似parse(','(A, B), and(Ap, Bp)) :- parse(A, Ap), parse(B, Bp). 或者简单地说,parse((A, B), and(Ap, Bp)) :-...
  • 这个检查到底是什么? parse(A, Ap) 是什么意思?
  • 我展示的是你如何递归解析,这是解析+ (a,b)之类的表达式所必需的,或者更复杂的+ (a, (b ; c))(我假设你需要处理,或者不?)。 parse(A, Ap) 表示A 表示的表达式将进一步解析为Ap。在某些时候,您需要一个基本情况,可能类似于parse(A, A) :- atom(A).,它表示原子将解析为自身(无需进一步解析)。所以parse(a, A) 会导致A = a

标签: prolog


【解决方案1】:

这里是翻译,的谓词(;类似)

% translates (a, b, c, ...) to and(a, and(b, and(c, ...)))
parse(A, A) :- atom(A).

parse((A, B), and(Ao, Bo)) :-
    parse(A, Ao),
    parse(B, Bo).

% translates (a, b, c, ...) to and(a, b, c, ...)
parse1(A, A) :- atom(A).

parse1((A, B), O) :-
    parse1(A, Ao),
    parse1(B, Bo),
    Bo =.. [and | R],
    O =.. [and, Ao | R], !.

parse1((A, B), O) :-
    parse1(A, Ao),
    parse1(B, Bo),
    O =.. [and, Ao, Bo].

Prolog 是homoiconic,这样可以很好地编写这种谓词。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多