Prolog:使用运算符使双重否定成为可能
Prolog: Make double negation possible with an operator
基于我的问题 构建命题谓词,现在我想在序言中实现双重否定。不幸的是我建立了:像 (? :- proposition(--a)) 这样的调用会导致语法错误。
有没有办法在不丢失我的操作员的情况下解决这个问题-?
Prolog 在运算符周围有一些复杂的语法规则以避免歧义。在某些情况下,您必须插入空格或括号以明确您想要什么。
这个有效(而且是我喜欢的形式):
?- X = -(-a).
X = - -a.
?- proposition(-(-a)).
true.
这也有效:
?- X = - -a.
X = - -a.
?- proposition(- -a).
true.
如果您觉得这不方便,您可以做的一件事是将 --
、---
等定义为类似于 -
:
的运算符
?- op(200, fy, --).
true.
?- op(200, fy, ---).
true.
?- X = --a, Y = ---a.
X = --a,
Y = ---a.
?- --a = -(-a).
false.
然后每次接受用户输入时,您可以先 运行 一个“预处理器”,将 --a
之类的术语翻译成 -(-a)
。我个人认为这不值得,但这可能是一个有趣的练习。
基于我的问题
有没有办法在不丢失我的操作员的情况下解决这个问题-?
Prolog 在运算符周围有一些复杂的语法规则以避免歧义。在某些情况下,您必须插入空格或括号以明确您想要什么。
这个有效(而且是我喜欢的形式):
?- X = -(-a).
X = - -a.
?- proposition(-(-a)).
true.
这也有效:
?- X = - -a.
X = - -a.
?- proposition(- -a).
true.
如果您觉得这不方便,您可以做的一件事是将 --
、---
等定义为类似于 -
:
?- op(200, fy, --).
true.
?- op(200, fy, ---).
true.
?- X = --a, Y = ---a.
X = --a,
Y = ---a.
?- --a = -(-a).
false.
然后每次接受用户输入时,您可以先 运行 一个“预处理器”,将 --a
之类的术语翻译成 -(-a)
。我个人认为这不值得,但这可能是一个有趣的练习。