Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/5.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,我正在努力学习Prolog,我在逻辑练习方面遇到了一些问题 鲍勃、汤姆、萨姆在银行有一份会计、出纳和经理的工作。 以下是关于他们的更多事实: 如果山姆是出纳员,而不是汤姆是经理 如果山姆是经理,汤姆是会计 如果汤姆不是出纳,鲍勃也不是经理 如果鲍勃是会计,山姆是经理 了解汤姆、山姆和鲍勃的职业 对于较小的数据集,您可以使用生成和测试进行求解,请参见/2。要轻松地转换每个规则,请使用工作人员名称命名一个变量。我只展示第一个条件 q([sam=Sam, tom=Tom, bob=Bob]) :-

我正在努力学习Prolog,我在逻辑练习方面遇到了一些问题

鲍勃、汤姆、萨姆在银行有一份会计、出纳和经理的工作。 以下是关于他们的更多事实:

  • 如果山姆是出纳员,而不是汤姆是经理
  • 如果山姆是经理,汤姆是会计
  • 如果汤姆不是出纳,鲍勃也不是经理
  • 如果鲍勃是会计,山姆是经理
了解汤姆、山姆和鲍勃的职业


对于较小的数据集,您可以使用生成和测试进行求解,请参见/2。要轻松地转换每个规则,请使用工作人员名称命名一个变量。我只展示第一个条件

q([sam=Sam, tom=Tom, bob=Bob]) :-
  ...,
  ( Sam = cashier -> Tom = manager ; true ),
  ....
有了这些,我得到了这些解决方案

?- q(X).
X = [sam=accountant, tom=cashier, bob=manager] ;
X = [sam=manager, tom=accountant, bob=cashier] ;
X = [sam=accountant, tom=manager, bob=cashier] ;
false.

我们可以有一些想法,请拿出你的!Prolog对我来说非常困难=(我将非常感谢任何帮助。你可以有一份人员名单[[sam,WS],[tom,WT],[bob,WB]]和一份工作清单[会计,出纳,经理],每个人在工作列表中都有一份工作,所有工作都是不同的,并且人员列表必须验证您描述的四条规则。继续看,通过几个小时的阅读和尝试,您应该能够解决问题。您确定这些规则是完整的吗?我有3个解决方案…非常感谢,我已经做了一些工作
q([sam/A,tom/B,bob/C]):-N=[accountan,cashier,manager],P=[A,B,C],permute(N,P),[accountan=B->cashier=C;true),[accountan=C->cashier=A;true),(not(cashier=B)->not(manager=C);true),[manager=A->accountan=C;true]追加([H|],B,[H|T1]):-append(T),追加(T,B,T1)。插入(Y,XZ,XYZ):-append(X,Z,XZ),附加(X,[Y],XY),附加(XY,Z,XYZ)。排列([],[])。排列([H | T],L):-排列(T,T1),插入(H,T1,L)。