只是想知道为什么这个简单的代码无法按预期工作:
validAlloc(Reg, Reg, Reg, Reg, Reg) :- register(Reg).
基本上我想检查一下,如果用户输入validAlloc(1,2,3,4,5),那些数字存在于寄存器中。我的问题是它只有在每个数字都相同的情况下才有效。但我希望用户能够输入存在的不同数字的组合。
感谢您的帮助
答案 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
。