检查条目是否存在为事实

时间:2016-08-19 14:34:38

标签: prolog

只是想知道为什么这个简单的代码无法按预期工作:

validAlloc(Reg, Reg, Reg, Reg, Reg) :- register(Reg).

基本上我想检查一下,如果用户输入validAlloc(1,2,3,4,5),那些数字存在于寄存器中。我的问题是它只有在每个数字都相同的情况下才有效。但我希望用户能够输入存在的不同数字的组合。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

上述不起作用的原因是当您编写规则时

validAlloc(Reg, Reg, Reg, Reg, Reg)

prolog认为所有五个参数都相同(因为它们都被命名为Reg)。

一个简单的答案是:

validAlloc(Reg, Reg1, Reg2, Reg3, Reg4) :-
    register(Reg),register(Reg1),register(Reg2),register(Reg3),register(Reg4).

另一个更优雅的解决方案是:

validAlloc2([]).
 validAlloc2([H|T]) :- register(H),validAlloc2(T).

在上面你提供了(五个)元素的列表,而不是五个数字。

如果你需要像以前一样工作,你可以简单地写:

validAlloc(Reg, Reg1, Reg2, Reg3, Reg4):-
  validAlloc2([Reg, Reg1, Reg2, Reg3, Reg4]). 

上面定义了validAlloc2