Prolog - 如果条件1和条件2做x

时间:2015-09-26 22:51:06

标签: prolog

我想在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,那么写这个的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

如果您确实想要使用目标L=1L=0并且X是一个整数,请使用

:- 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时,这才有用。