Logic 如何在答案集编程中表示待推理的未知知识?

Logic 如何在答案集编程中表示待推理的未知知识?,logic,reasoning,answer-set-programming,clingo,Logic,Reasoning,Answer Set Programming,Clingo,以下是需要解决的问题: 如果吉姆不给他的孩子们买玩具,吉姆的孩子们就不会在圣诞节收到玩具。如果吉姆的孩子们不给他们写圣诞信,吉姆就不会给他们买玩具。吉姆的孩子们确实会收到圣诞玩具。”假设对这个故事的预期解释意味着吉姆的孩子们写了他们的圣诞信 现在,我想把上面的信息编码成规则和事实,以便clingo推断吉姆的孩子是否写了这些信 我编写的程序如下: son(peter,jim). receive_presents(peter,jim). -buy_presents(jim,peter) :- son

以下是需要解决的问题:

如果吉姆不给他的孩子们买玩具,吉姆的孩子们就不会在圣诞节收到玩具。如果吉姆的孩子们不给他们写圣诞信,吉姆就不会给他们买玩具。吉姆的孩子们确实会收到圣诞玩具。”假设对这个故事的预期解释意味着吉姆的孩子们写了他们的圣诞信

现在,我想把上面的信息编码成规则和事实,以便clingo推断吉姆的孩子是否写了这些信

我编写的程序如下:

son(peter,jim).
receive_presents(peter,jim).
-buy_presents(jim,peter) :- son(peter,jim),
                            not write_letters(peter).
-receive_presents(peter,jim) :- not buy_presents(jim,peter).
简单来说,我只是假设吉姆只有一个孩子叫彼得

在我看来,答案集的推理过程是:

jim_did_buy_toys :- children_do_receive_toys.
children_did_write_their_christmas_letters :- jim_did_buy_toys.
children_do_receive_toys.
  • 所有事实都在答案集中,即儿子(彼得,吉姆),
    接受玩具(彼得,吉姆)
    肯定应该在答案集中

  • 由于
    接收玩具(彼得,吉姆)
    在答案集中,因此
    接收礼物(彼得,吉姆)
    将不在答案集中。因此,
    不买礼物(吉姆,彼得)
    应该为false,并且
    买礼物(吉姆,彼得)
    在答案集中

  • 因为
    买礼物(吉姆,彼得)
    在答案集中,所以
    -买礼物(吉姆,彼得)
    是错误的。由于儿子(彼得,吉姆)在答案集中,
    不写字母(彼得)
    将为假,
    写字母(彼得)
    将在答案集中

  • 所以我认为答案应该是{
    儿子(彼得,吉姆)
    收到玩具(彼得,吉姆)
    买礼物(吉姆,彼得)
    写信(彼得)

    因此我们可以得出结论,彼得确实写了这封信

    但在clingo中运行此程序时,我得到以下信息:

    clingo version 5.3.0
    Reading from jim.lp
    jim.lp:4:29-49: info: atom does not occur in any rule head:
      write_letters(peter)
    jim.lp:5:37-60: info: atom does not occur in any rule head:
      buy_presents(jim,peter)
    Solving...
    UNSATISFIABLE
    
    Models       : 0
    Calls        : 1
    Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
    CPU Time     : 0.001s
    
    我认为clingo需要在规则中首先定义每个原子操作。但在这里,我只是想解释一下,如果彼得写了这封信,那么我就不能自我定义“如果xxx,那么彼得写这封信”,因为这正是我自己做推理部分的原因


    如何解决答案集编程中的此类问题?

    注意,在经典逻辑中
    p=>q
    等价于
    !q=>!p
    。这项练习似乎是以第二种形式表述的,所以你所要做的就是把它转回到第一种形式:

    If Jim does not buy toys for his children, Jim’s children will not receive toys for Christmas
    
    变成

    If Jim’s children do receive toys for Christmas, then Jim did buy toys for his children
    
    If Jim did buy toys for his children, Jim’s children did write their Christmas letters
    
    第二条规则:

    If Jim’s children do not write their Christmas letters, Jim will not buy them toys
    
    变成

    If Jim’s children do receive toys for Christmas, then Jim did buy toys for his children
    
    If Jim did buy toys for his children, Jim’s children did write their Christmas letters
    
    因此,该计划将是:

    jim_did_buy_toys :- children_do_receive_toys.
    children_did_write_their_christmas_letters :- jim_did_buy_toys.
    children_do_receive_toys.
    

    显然,这项练习的目的是要表明,这种“反事实”推理可以通过简单地用古典逻辑法则“消除”任何否定来编码,从而避免所有的麻烦,弄清楚使用哪种否定。

    我理解你的解释。但是在你的程序中,规则是孩子们写他们的圣诞信:-吉姆买玩具。实际上是你自己做推理工作。我们想做的是让ASP解算器来做这件事,这就是我的问题。