Prolog implying a negative predicate

后端 未结 4 478
时光说笑
时光说笑 2021-02-02 16:20

How can I write the following rule in PROLOG: if P then not Q

I understand that you can easily write if P then Q the predicates like q(X) :- p(X)

4条回答
  •  借酒劲吻你
    2021-02-02 16:47

    You can use minimal logic to define a negative head. In minimal logic ~A can be viewed as A -> ff. Thus the following

    P -> ~Q
    

    Can be viewed as:

    P -> (Q -> ff).
    

    Now if we take the following identity (A -> (B -> C)) = (A & B -> C), we see that the above is equivalent to:

    P & Q -> ff.
    

    There is now one problem, how can we ask negative queries? There is one way to make use of minimal logic which is different from negation as failure. The idea is that a query of the form:

    G |- A -> B
    

    is answered by temporarily adding A to the prolog program G, and then trying to solve B, i.e. doing the following:

    G, A |- B
    

    Now lets turn to Prolog notation, we will show that p, and p -> ~q implies ~q by executing a (minimal logic) Prolog program. The prolog program is:

    p.
    ff :- p, q.
    

    And the query is:

    ?- q -: ff.
    

    We first need to define the new connective (-:)/2. A quick solution is as follows:

    (A -: B) :- (assert(A); retract(A), fail), B, (retract(A); assert(A), fail).
    

    Here you see a realisation of this minimal logic negation in SWI Prolog:

    Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.4)
    Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
    
    1 ?- [user].
    :- op(1200,xfy,-:).
    |: (A -: B) :- (assertz(A); retract(A), fail), B, (retract(A); assertz(A), fail).
    |: p.
    |: ff :- p, q.
    |:
    % user://1 compiled 0.02 sec, 1,832 bytes
    true.
    
    2 ?- q -: ff.
    true .
    

    Best Regards

    Reference: Uniform Proofs as a Foundation for Logic Programming (1989) by Dale Miller, Gopalan Nadathur, Frank Pfenning, Andre Scedrov

提交回复
热议问题