我通常会写两个条款这样的声明,如下所示:
x :- y.
y :- x.
Run Code Online (Sandbox Code Playgroud)
在Prolog中,是否有任何简洁的方法来编写一个语句,如"if x then y,反之亦然"?
换句话说,是否可以将"x if if且only only y"写为单个语句?
你说你通常会写"p,当且仅当q"(我将在下面写q <=> q)as
p :- q.
q :- p.
Run Code Online (Sandbox Code Playgroud)
但这只是正确的
在这种情况下,代码并没有真正说出任何有趣的东西,只有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)