Prolog是否有一个;当且仅当;操作人员

Prolog是否有一个;当且仅当;操作人员,prolog,Prolog,我通常会把这样的声明写成两个条款,如下所示: x :- y. y :- x. 在Prolog中,有没有简洁的方法来编写类似“IfX thenY,反之亦然”这样的语句 换句话说,是否可以将“x当且仅当y”作为一条语句编写?据我所知,不是在swi prolog中 另一方面,您可以编写一个小型重写谓词,使用以下小型程序自动重写程序理论: :- dynamic([system:term_expansion/2]). :- op(900, xfx, user:(:::)). system:term_

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

x :- y.
y :- x.
在Prolog中,有没有简洁的方法来编写类似“IfX thenY,反之亦然”这样的语句


换句话说,是否可以将“x当且仅当y”作为一条语句编写?

据我所知,不是在swi prolog中

另一方面,您可以编写一个小型重写谓词,使用以下小型程序自动重写程序理论:

:- dynamic([system:term_expansion/2]).

:- op(900, xfx, user:(:::)).

system:term_expansion(:::(H,T),[H :- T, T :- H]) :-
    callable(H),
    callable(T).
然后你可以简单地使用

x ::: y.
当然,您可以指定除
之外的其他运算符,只需相应地替换运算符定义(
op/3
)和
术语扩展/2



另一方面,只有在调用此函数之前解析了头部和身体的坐标,这才不会屈服于无限循环。否则,转换后的程序将无限循环。Prolog不是一个真正的逻辑引擎,它只是一个逻辑编程:用逻辑语法指定一个程序,而不是表达一个逻辑理论。

你说你通常会写“p if and only if q”(我将在下面写q q),如下所示

但这只有在以下情况下才是正确的

  • p和q没有其他条款
  • 不涉及任何变量
  • 在这种情况下,代码并没有说什么有趣的事情,只是p和q是等价的,但是它们是真是假并没有说明

    如果涉及变量,比如

    p(X) :- q(X).
    q(X) :- p(X).
    
    那么意思是

    forall X: p(X) <= q(X)  and  forall X': q(X') <= p(X')
    
    意味着


    在Prolog中可以使用表示“当且仅当”规则

    例如,在SWI Prolog中:

    :- use_module(library(chr)).
    
    :- chr_constraint class/2,species/2,animal/1,mammal/1,bird/1.
    
    %X can be a member of only one species
    species(X,X1),species(X,X2) <=> X1 = X2.
    
    %X can be a member of only one class
    class(X,X1),class(X,X2) <=> X1 = X2.
    
    %X is a bird if and only if X is an animal and a pelican or a pigeon
    bird(X) <=> animal(X),class(X,bird),(species(X,pelican);species(X,pigeon)).
    
    %X is a mammal if and only if X is an animal
    mammal(X) <=> animal(X),class(X,mammal),(species(X,cat);species(X,dog);species(X,bear)).
    
    :-使用_模块(库(chr))。
    :-chr_约束类/2,物种/2,动物/1,哺乳动物/1,鸟类/1。
    %X只能是一个物种的成员
    物种(X,X1),物种(X,X2)X1=X2。
    %X只能是一个类的成员
    类(X,X1),类(X,X2)X1=X2。
    %X是鸟当且仅当X是动物和鹈鹕或鸽子时
    鸟类(X)动物(X),类别(X,鸟),(物种(X,鹈鹕);物种(X,鸽子))。
    %X是哺乳动物当且仅当X是动物时
    哺乳动物(X)动物(X),类(X,哺乳动物),(物种(X,猫);物种(X,狗);物种(X,熊))。
    
    逻辑编程与真正的“逻辑引擎”有何不同?我以前从未听说过这种区别。Prolog使用SLD范式:从左到右的深度优先评估,否定作为有限失败和封闭世界假设。例如,答案集编程使用不同的语义(自下而上、构造性否定等)。如果Prolog确实不能表达逻辑理论,那么还有其他语言可以表达它们吗?有几种语言,每种语言都有各自的语义和缺点。一个相当完整的软件包就是我们在大学开发的IDP系统。它支持完整的一阶逻辑。您好,我是IDP系统的维护人员之一。目前我们没有支持论坛,但您可以向krr发送有关IDP的问题-dev@cs.kuleuven.be我们会尽力帮助你
    forall X,X':  p(X) <= q(X)  and  q(X') <= p(X')
    
    forall X:  p(X) <= q(X)  and  q(X) <= p(X)
    
    p(X,Y) :- q(X,Z).
    
    forall X,Y  exists Z:  p(X,Y) <=> q(X,Z)
    
    p_iff_q(X) :- p(X) <=> q(X).
    
    p_iff_q(X) :- p(X),q(X) ; \+p(X),\+q(X).
    
    :- use_module(library(chr)).
    
    :- chr_constraint class/2,species/2,animal/1,mammal/1,bird/1.
    
    %X can be a member of only one species
    species(X,X1),species(X,X2) <=> X1 = X2.
    
    %X can be a member of only one class
    class(X,X1),class(X,X2) <=> X1 = X2.
    
    %X is a bird if and only if X is an animal and a pelican or a pigeon
    bird(X) <=> animal(X),class(X,bird),(species(X,pelican);species(X,pigeon)).
    
    %X is a mammal if and only if X is an animal
    mammal(X) <=> animal(X),class(X,mammal),(species(X,cat);species(X,dog);species(X,bear)).