Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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
Prolog 将一组角色分配给一组人员_Prolog - Fatal编程技术网

Prolog 将一组角色分配给一组人员

Prolog 将一组角色分配给一组人员,prolog,Prolog,我正试图写一个程序来解决这个问题。你不必为这个问题检查它 问题是,有6个人: 牧师,首席执行官,医生,小丑,机器人专家,安全官员 他们共同承担以下职责: 核武器,怀面,电子人,换生灵和2X Ok 我的想法是以角色(人)的形式使用事实 核武器(牧师) 问题是,我怎样才能创建一个规则,当一个人有一个特定的角色,那么 同一个人没有其他角色;如果是核武器(牧师),那么就不要拥抱(牧师)。(注意:我希望我不会再次遇到被切割怪物否定!或者我应该创造可能的否定事实?) 同样的角色不能从其他人身上取而代之;如果

我正试图写一个程序来解决这个问题。你不必为这个问题检查它

问题是,有6个人: 牧师,首席执行官,医生,小丑,机器人专家,安全官员

他们共同承担以下职责: 核武器,怀面,电子人,换生灵和2X Ok

我的想法是以角色(人)的形式使用事实 核武器(牧师)

问题是,我怎样才能创建一个规则,当一个人有一个特定的角色,那么

  • 同一个人没有其他角色;如果是核武器(牧师),那么就不要拥抱(牧师)。(注意:我希望我不会再次遇到被切割怪物否定!或者我应该创造可能的否定事实?)
  • 同样的角色不能从其他人身上取而代之;如果是核武器(牧师),那么就不是核武器(小丑)。例外:有两个Ok(X)的家伙,所以在Ok(X)中必须有两个X值,然后Ok(X:除这两个值以外的任何其他值)应该计算为false

  • 如果可能的话,我希望有一个答案能引导我找到正确的思维方式,而不提供完整的解决方案,从而从建模和记忆语言中获得乐趣:)

    我认为如果使用形式为
    hasRole(Person,Role)
    的谓词会更容易

    要确保一个人只有一个角色,请执行以下操作:

    hasSingleRole(Person, Role) :- hasRole(Person, Role), \+ ((hasRole(Person, Role2), Role \= Role2)).
    
    同样,为了确保角色是唯一的:

    hasUniqueRole(Person, Role) :- hasRole(Person, Role), \+ ((hasRole(Person2, Role), Person\= Person2)).
    

    可以对
    角色(Person)
    格式执行相同的操作,但它要求您显式列出所有角色并执行一些元编程。

    @GeorgeMenoutis这就是您在Prolog中编写“not”的方式。@GeorgeMenoutis特别是,这意味着后面的表达式无法验证。注意双括号!由于表达式中的
    ,如果只有一对括号,Prolog将尝试使用两个参数调用
    \+
    ,这不起作用。为了理解这一点,我需要进行的阅读量大于注释大小!你能不能提供一个链接,不是一般教程页面,而是与特定提示相关联的链接?@GeorgeMenoutis哪个提示?双重人格?我不确定是否有特定的来源,这只是一个模糊语法的产物,
    可能意味着“逻辑和”和“下一个参数”。你知道我不明白什么吗?如果我提供了一些hasRole事实,这样所有人都被分配了一个角色,但是人P1不存在,并且只剩下角色R1,那么您的规则会创建hasRole(P1,R1)事实吗?在我看来,你的规则只是为了维护1-1角色的个人配对,而不是创建它们。但是我需要创建它们。如果你只是开始了解人和角色,而不知道谁有什么角色,那么独特性可以动态地建立起来。例如,如果在代码中的某个点上,您认为要将角色分配给某个人,则可以首先查询该个人的角色,以查看是否获得成功的查询。如果成功,则不希望分配其他角色。