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

时间:2018-06-29 07:29:39

标签: prolog

我正在尝试编写一个程序来解决this game。您无需针对这个问题进行检查。

问题是,有6个人: 牧师,首席工程师,医学博士,小丑,机器人专家,SecurityOfficer

他们扮演以下角色: NukeOp,Facehugged,Cyborg,Changeling和2 x Ok

我的想法是以角色(人)的形式使用事实,例如 NukeOp(牧师)。

问题是,我该如何创建一条规则,规定当一个人扮演特定角色时,

  1. 同一个人没有其他角色;例如,如果NukeOp(牧师)则不进行Facehugged(牧师)。 (注意:我希望我不会再遇到被切块取反的怪物!还是应该创建可能的求反事实?)
  2. 不能从其他角色上扮演同一角色;例如,如果NukeOp(Chaplain),则不是NukeOp(Clown)。例外:有两个Ok(X)家伙,因此Ok(X)中必须有两个X值,然后确定Ok(X:这两个值之外的任何其他值)都应为假

如果可能的话,我想给出一个答案,使我能够以正确的方式思考,而无需提供完整的解决方案,从而从建模和记忆语言的乐趣中解脱出来:)

1 个答案:

答案 0 :(得分:2)

我认为如果您使用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)).

可以使用role(Person)格式执行相同的操作,但是它要求您明确列出所有角色并进行一些元编程。