Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logic 如何在clingo?;_Logic_Clingo - Fatal编程技术网

Logic 如何在clingo?;

Logic 如何在clingo?;,logic,clingo,Logic,Clingo,我现在正在学习prolog并尝试使用clingo来建模关键约束,但遇到了一些麻烦,希望有人能帮我一把。以下是我的问题: 我想构建一个关键约束,并在clingo中编写如下内容 作为完整性约束,但出现语法错误。我试着用另一种方式来表达它,它似乎起了作用 Y1=Z1:-stu(X,Y1,Y2),stu(X,Z1,Z2). Y2=Z2:-stu(X,Y1,Y2),stu(X,Z1,Z2). 但我仍然想知道,我是否可以将单独的约束组合成一个关键约束,从而使程序更加简洁 另一个问题是关于如何在clingo

我现在正在学习prolog并尝试使用clingo来建模关键约束,但遇到了一些麻烦,希望有人能帮我一把。以下是我的问题:

  • 我想构建一个关键约束,并在clingo中编写如下内容
  • 作为完整性约束,但出现语法错误。我试着用另一种方式来表达它,它似乎起了作用

    Y1=Z1:-stu(X,Y1,Y2),stu(X,Z1,Z2).
    Y2=Z2:-stu(X,Y1,Y2),stu(X,Z1,Z2).
    
    但我仍然想知道,我是否可以将单独的约束组合成一个关键约束,从而使程序更加简洁

  • 另一个问题是关于如何在clingo中建立事实“存在某些东西”,我想要实现的是使用clingo来判断两组给定的规则是否满足,下面是一个示例
  • 第一组规则说“存在一个id为1、名字为mike的学生”:

    以及“两个具有相同id的学生应具有相同的姓名和年龄”(这是一个关键约束):

    因此,我用Clingo编写了第一套规则:

    stu(1,"mike",v).
    :-stu(X,Y1,Y2),stu(X,Z1,Z2),(Y1,Y2)!=(Z1,Z2).
    
    stu(1,v,27).
    
    假设给出了第二组规则,即“存在一个id为1且年龄为27岁的学生”:

    第二套规则用Clingo写成:

    stu(1,"mike",v).
    :-stu(X,Y1,Y2),stu(X,Z1,Z2),(Y1,Y2)!=(Z1,Z2).
    
    stu(1,v,27).
    

    我的问题是,如果简单地将这两套规则放在一个程序中,Clingo会判断它们不能令人满意的原因(“mike”,v)!=(五、27)。因此,我的解决方案(可能是构建存在的方式)肯定有问题,因为如果你有一个id=1、name=“mike”和age=27的学生,这两组规则实际上是可以满足的。我想知道是否有一种方法可以使用Clingo来判断上述两套规则的可满足性,谢谢

    如果要使用元组比较发布完整性约束

    :-stu(X,Y1,Y2),stu(X,Z1,Z2), (Y1,Z2)!=(Z1,Z2).
    
    可能是你想写的

    像这样的规则

    Y1=Z1:-stu(X,Y1,Y2),stu(X,Z1,Z2).
    
    相当于

    :-stu(X,Y1,Y2),stu(X,Z1,Z2), Y1!=Z1.
    
    回答你的第二个问题:

    将年龄和名称分成两个谓词。您引入了一个任意的“v”作为“not given”的占位符持有者,这就是您出现问题的原因。 你的问题都不存在,如果没有名字或年龄,这也是一种更干净的风格

    stu_name(123,"steve").
    stu_age(123,42).
    % it is not possible to have the same ID but different names
    :- stu_name(ID,Name1), stu_name(ID,Name2), Name1 != Name2.
    % it is not possible to have the same ID but different ages
    :- stu_age(ID,Age1), stu_age(ID,Age2), Age1 != Age2.
    
    将姓名和年龄分开可以使您没有两个条目中的任何一个。当你使用三元stu(ID,Name,Age)谓词时,你实际上总是要给出一个名称和年龄(“v”不是什么神奇的东西,它会被解释为Name或Age)

    为了避免几个学生使用相同的id,您可以写:

    stu(123,"Anne",30).
    stu(123,"Mia",14).
    % it is not possible to have the same ID but not completely equal entries
    :- stu(ID,Name1,Age1), stu(ID,Name2,Age2), (Name1,Age1)!=(Name2,Age2).
    

    请您澄清什么是关键约束,以及您得到的预期结果/错误是什么?你也可以重读一些句子并重新措辞,因为它们有时很难理解吗?嗨,谢谢你的回答,我已经重新措辞了我的第二个问题。我知道这个问题有点奇怪,希望这次我能说清楚。我试图表达你想要的,我猜你指的是某种数据库关键功能,比如ID的唯一性。是的,这正是我想要表达的,谢谢你的回答,这真的很有帮助!