我需要知道变量是否在给定的规则中被实例化,但我不被允许使用var(X),并且不知道如何去做。
具体来说,我的规则得到4个参数(P,A,B,C)。
如果P,A,B,C被实例化,那么我的规则应该“返回”真如果(A + B)mod(P)= C(mod(P))。
如果A B和C中的一个没有被赋值,我应该返回它的值,以保证(A + B)mod(P)= C(mod(P))。例如,如果C未被实例化,则规则应该“返回”(A + B)mod(P)为C,并且如果A或B未被实例化则类似的行为。编写每条规则很容易,但是如果我不知道变量是否被实例化,我怎么知道我处于哪种情况?如前所述,我不能使用var(X)或number(X)等等,我只能假设P总是被实例化。
在此先感谢!如何检查变量是否在Prolog中实例化?
回答
手动测试是否实例化了某些东西,这使得很难正确处理实践中可能出现的所有情况。几乎总是,对于某些你没有想过的实例化模式,你的结果代码会表现不正确。
幸运的是,这样的问题有一个声明性的解决方案:约束在所有情况下都能正常工作,不管是什么实例化,什么都不是。
例如,使用您的Prolog系统的CLP(FD)的约束解决您的任务:
:- use_module(library(clpfd)).
same_sum_mod(A, B, C, P) :-
(A+B) mod P #= C mod P.
它正常工作在所有方向上,例如:
?- same_sum_mod(1, 2, 3, 3).
true.
?- same_sum_mod(1, B, 3, 2).
1+B#=_G823,
_G823 mod 2#=1.
?- same_sum_mod(1, 2, 3, P).
P in inf..-1\/1..sup,
3 mod P#=_G855,
3 mod P#=_G855.
而且还要检查出现以下情况,其中B
最初是而非已实例化,但其域已知,而con straint解算器可以推断出单个允许解:
?- B in 0..1, same_sum_mod(1, B, 3, 2). B = 0.
这种情况下不能用简单的实例化的检查处理,但是需要约约束推理。
有关CLP(FD)约束条件的更多信息,请参阅clpfd。
我认为@mat答案绝对是解决您的问题的方法。
不过,如果你想检查一个变量是否不是实例不使用内置谓词VAR/1,它正是这么做的(由于一些限制,例如,你的老师明确禁止它),你可以用双重否定两次测试的能力,势必没有真正实例化它,如果它没有绑定变量:
not_inst(Var):-
\+(\+(Var=0)),
\+(\+(Var=1)).
测试用例:
?- not_inst(X).
true.
?- not_inst(a).
false.
正确的方法是用'var/1'和' nonvar/1'。我认为你应该提到,如果有人通过谷歌回答这个问题,并且不停地阅读OP说他们被禁止使用这些谓词。 –
@DanielLyons:为了以防万一,以粗体添加了一些评论。也许我应该完全删除答案? – gusbro
不,我喜欢这个。请保留! –
- 1. 如何检查变量是否未在Swift中初始化?
- 2. 如何检查变量是否在python
- 3. PHP:检查一个变量是否是某个类的实例
- 4. Coco中的KVC如何检查实例变量是否可访问?
- 5. 如何检查一个变量是否是一个类的实例?
- 6. CDI。如何检查bean是否实例化?
- 7. C#:如何检查一个实例是否可序列化
- 8. 如何检查变量是否为CFString?
- 9. 如何检查变量是否定义?
- 10. 如何检查变量是否为空?
- 11. JavaScript:如何检查变量是否存在变量名?
- 12. 检查变量是否在列表中
- 13. 如何检查我的变量是否包含我的类的实例?
- 14. 如何检查一个类是否已经在Python中实例化?
- 15. 如何检查传统ASP中是否存在对象实例?
- 16. 如何检查我的prolog数据库中是否存在特定的事实
- 17. 如何检查是否AWS实例实际上是提供
- 18. 检查是否一个布尔变量在C#中初始化#
- 19. 如何检查对象是否是IE中NodeList的实例?
- 20. Prolog实例化错误?
- 21. Lua检查表是否是'实例'
- 22. 如何检查类变量@@ abc是否已初始化或不在rhomobile中?
- 23. 如何检查float变量是否包含实数或不在C++中?
- 24. 如何检查jquery中是否存在变量
- 25. 如何检查数组中是否存在变量?
- 26. Python 3如何检查一个变量是否在列表中
- 27. 如何检查目标变量是否在数组中?
- 28. 如何检查rspec中是否存在辅助方法/变量?
- 29. 如何在UNIX中检查变量是否为编号
- 30. 如何检查变量是否在列表中?
您不允许使用'号(X)'? – BretC
@BretC OP状态,* ...我不能使用'var(X)'或'number(X)'等等。 – lurker