Prolog是否有"if if only only"运算符?

And*_*een 4 prolog

我通常会写两个条款这样的声明,如下所示:

x :- y.
y :- x.
Run Code Online (Sandbox Code Playgroud)

在Prolog中,是否有任何简洁的方法来编写一个语句,如"if x then y,反之亦然"?

换句话说,是否可以将"x if if且only only y"写为单个语句?

jsc*_*mpf 6

你说你通常会写"p,当且仅当q"(我将在下面写q <=> q)as

p :- q.
q :- p.
Run Code Online (Sandbox Code Playgroud)

但这只是正确的

  1. p和q没有其他条款
  2. 没有涉及变量

在这种情况下,代码并没有真正说出任何有趣的东西,只有p和q是等价的,但是没有说明它们是真还是假.

如果涉及变量,比方说

p(X) :- q(X).
q(X) :- p(X).
Run Code Online (Sandbox Code Playgroud)

然后意思是

forall X: p(X) <= q(X)  and  forall X': q(X') <= p(X')
Run Code Online (Sandbox Code Playgroud)

这是一样的

forall X,X':  p(X) <= q(X)  and  q(X') <= p(X')
Run Code Online (Sandbox Code Playgroud)

当你真正想说的是

forall X:  p(X) <= q(X)  and  q(X) <= p(X)
Run Code Online (Sandbox Code Playgroud)

在另一方面,只要你只有一个单一的谓语从句,然后独自该条款可以读为"当且仅当".例如

p(X,Y) :- q(X,Z).
Run Code Online (Sandbox Code Playgroud)

手段

forall X,Y  exists Z:  p(X,Y) <=> q(X,Z)
Run Code Online (Sandbox Code Playgroud)

如果在其他地方定义了q/2,那么这是一个明智的事情.这样你就可以定义别名,投影等.


您没有给出任何问题的背景知识,但是一旦考虑变量,就可以问"在哪种情况下p <=> q?",其中p和q是任意定义的.那你想写点像

p_iff_q(X) :- p(X) <=> q(X).
Run Code Online (Sandbox Code Playgroud)

在简单的Prolog中,你必须改写成类似的东西

p_iff_q(X) :- p(X),q(X) ; \+p(X),\+q(X).
Run Code Online (Sandbox Code Playgroud)