Prolog中的基本规则问题

Prolog中的基本规则问题,prolog,Prolog,我想在prolog中翻译我的自然代码 这是我的自然法则: if E < W then if C < Max then print('increment C') else print('C unchanging') if E > W then if C > Min then print('decrement C') else print('error') 如果EMin,则 打印(‘减量C’) 其他的

我想在
prolog
中翻译我的自然代码

这是我的自然法则:

if E < W then
   if C < Max then
      print('increment C')
   else
      print('C unchanging')
if E > W then
   if C > Min then
      print('decrement C')
   else
      print('error')
如果EW,那么
如果C>Min,则
打印(‘减量C’)
其他的
打印('错误')
以下是我在SWI Prolog中的代码:

tddv_worst(_).
tddv_best(_).
tddv_courant(_).
tddv_estime(_).
etendue_gisement_courant(_).
etendue_gisement_min(_).
etendue_gisement_max(_).

compromis_1(tddv_estime(E),tddv_worst(W),etendue_gisement_courant(C),etendue_gisement_min(Min),etendue_gisement_max(Max)) :-
(E < W , C < Max) -> writeln('Increment C') ; writeln('C unchanging') ;
(E > W , C > Min) -> writeln('Decrement C') ; writeln('Error').
tddv_最差(u)。
tddv_最佳(u)。
tddv_courant(u)。
tddv_估计时间(u)。
电子证书。
电子延期登记(分钟)。
etendue_注册表_max(u)。
折衷方案1(tddv估计时间(E)、tddv估计时间(W)、etendue注册时间(C)、etendue注册时间最小(min)、etendue注册时间最大(max)):-
(Ewriteln(“增量C”);writeln('C unchanging');
(E>W,C>Min)->writeln(“减量C”);writeln('Error')。
当我在解释器中写下这句话时:

折衷方案1(tddv估计时间(19)、tddv估计时间(16)、etendue注册时间(2)、etendu注册时间(8)、etendue注册时间(1))

它显示
C unchanging

它不应该显示这个


有人能解释一下原因吗?

您的实现与您正在展示的C版本并不完全相同

这是您当前的代码:

(E < W , C < Max) -> writeln('Increment C') ;
writeln('C unchanging') ;
(E > W , C > Min) -> writeln('Decrement C') ;
writeln('Error').
与原始伪代码相当的Prolog是:

(   E < W
->  (   C < Max
    ->  writeln('increment C')
    ;   writeln('C unchanging')
    )
) ;
(   E > W
->  (   C > Min
    ->  writeln('decrement C')
    ;   writeln('Error')
    )
)
(E(C<最大值
->writeln('增量C')
;writeln('C unchanging')
)
) ;
(东>西)
->(C>Min
->writeln(‘减量C’)
;writeln('错误')
)
)

在Prolog中,这种行为恰巧与伪代码类似,因为
->
消除了成功后的选择点,并且Prolog不会回溯。

是的,我知道,但我不理解为什么比较语句中的逗号不正确您只有一条规则。规则标记为
:-
。您拥有的是一个规则中的一组
if
语句。你也有一堆没有明显原因的随机事实。您的
如果
总是通过
成功,那么
其他
。非常感谢!我用你的同类产品试过了,现在它成功了!
(   E < W
->  (   C < Max
    ->  writeln('increment C')
    ;   writeln('C unchanging')
    )
) ;
(   E > W
->  (   C > Min
    ->  writeln('decrement C')
    ;   writeln('Error')
    )
)