我想在prolog中编写等效的psudo函数:
function underhundred(X){
if (X >= 0 && X <=100) return 1;
else return 0;
}
我尝试写这个,但它没有编译:
underhundred(X,L) :- L is (X => 0, X =< 100 -> L = 1; L = 0) .
如果不在谓词之间使用prolog,那么写这个的正确方法是什么?
答案 0 :(得分:3)
如果您确实想要使用目标L=1
和L=0
并且X
是一个整数,请使用clpfd!
:- use_module(library(clpfd)).
物化就像一个魅力!
?- X in 0..100 #<==> L.
L in 0..1, X in 0..100#<==>L.
如果X
被实例化,该怎么办?
?- X in 0..100 #<==> L, X=(-7).
L = 0, X = -7. % out of bounds: -7 < 0 =< 100
?- X in 0..100 #<==> L, X=55.
L = 1, X = 55. % within bounds: 0 =< 55 =< 100
?- X in 0..100 #<==> L, X=111.
L = 0, X = 111. % out of bounds: 0 =< 100 < 111
答案 1 :(得分:0)
Prolog查询成功或失败。如果成功,它将返回它所做的绑定。
您可以使用clpfd将此谓词编写为:
:-use_module(library(clpfd)).
under_hundred_clpfd(X):-
X in 0..100.
(你可能更喜欢名字,例如between_0_100 ?,如果你真的想要低于100,那么你可以在inf..99中使用X)。 一些疑问:
?-under_hundred_clpfd(5).
true.
?-under_hundred_clpfd(101).
false.
?-under_hundred_clpfd(X).
X in 0..100.
传统的写作方式是:
under_hundred(X):-
X>=0,
X=<100.
但是这种方式对于未实例化的变量不起作用。
?-under_hundred(X).
ERROR: >/2: Arguments are not sufficiently instantiated
所以就像你说你可能需要设置一个介于/ 3或长度/ 2之间的目标来获得解决方案或类似的结构。
underhundred(X):-
length(_,X),
X>=0,
X=<100.
这不是一个非常好的解决方案,因为在后退跟踪上它将进入无限循环。 / 3之间的行为更好,但你不想要它:)。
答案 2 :(得分:0)
如果问题的主要内容是如何在Prolog中编写if-then-else结构,那么根据提议的定义,合理的答案是:
underhundred(X,L) :-
( X >= 0, X =< 100 )
-> L = 1
; L = 0.
只有在underhundred(X,L)
被充分实例化后调用X
时,这才有用。