Prolog-1和0.5之间的比较失败

Prolog-1和0.5之间的比较失败,prolog,Prolog,我有一个非常基本的函数,它基本上把输入的数字和一些常数进行比较。 这是密码- check(FEATURE_0, FEATURE_1, FEATURE_2, FEATURE_3, FEATURE_4, FEATURE_5) :- FEATURE_0 =< 37.95 -> FEATURE_3 =< 0.5 -> //Fails here with error Fail: >/2 write("Class 3&qu

我有一个非常基本的函数,它基本上把输入的数字和一些常数进行比较。 这是密码-

check(FEATURE_0, FEATURE_1, FEATURE_2, FEATURE_3, FEATURE_4, FEATURE_5) :-
    FEATURE_0 =< 37.95 ->
       FEATURE_3 =< 0.5 -> //Fails here with error Fail: >/2
            write("Class 3")
        ;FEATURE_3 > 0.5 ->
            write("Class 1")
    ;FEATURE_0 > 37.95 ->
        FEATURE_2 =< 0.5 ->
            write("Class 3")
        ;FEATURE_2 > 0.5 ->
            FEATURE_4 =< 0.5 ->
                write("Class 2")
            ;FEATURE_4 > 0.5 ->
                FEATURE_3 =< 0.5 ->
                    write("Class 2")
                    ;write("Class 0").
检查(特征0、特征1、特征2、特征3、特征4、特征5):-
特征_0=<37.95->
功能_3=<0.5->//此处失败,错误为Fail:>/2
书写(“第3类”)
;功能_3>0.5->
书写(“第1类”)
;功能_0>37.95->
特征_2=<0.5->
书写(“第3类”)
;功能_2>0.5->
特征_4=<0.5->
书写(“第2类”)
;功能_4>0.5->
特征_3=<0.5->
书写(“第2类”)
;写入(“0类”)。

除了
功能_0
之外,每一个其他值始终为1或0。但是,代码在第3行失败,说明
Fail:>/2
。我刚开始在作业中尝试prolog,所以我的经验是零,但是,据我所知,我怀疑这与比较整数和浮点值有关。我想知道这里的问题是什么,以及如何解决这个问题。

我在SWI Prolog中没有得到这个错误,但我得到了“单例变量:[FEATURE_1,FEATURE_5]”

请注意,所写的表达式与从缩进中得出的预期含义不一致:

第一个
(在
功能_3
之前的一个)是“最上面的”函子名称。通过
write\u canonical/2
打印正文可以(笨拙地)确定这一点:

?-编写规范((
|特征_0=<37.95->
|特征_3=<0.5->
|书写(“第3类”)
|;功能_3>0.5->
|书写(“第1类”)
|;特征0>37.95->
|特征_2=<0.5->
|书写(“第3类”)
|;特征_2>0.5->
|特征_4=<0.5->
|书写(“第2类”)
|;功能_4>0.5->
|特征_3=<0.5->
|书写(“第2类”)
|;写入(“0类”))。
其中给出(手动重新格式化):

;(>(=(=(>(B,0.5),写入(“类1”),
5944。
检查f3(f3):-f3=<0.5,写入(“类3”)。
检查f3(f3):-f3>0.5,写入(“类1”)。
检查f2(f2,,,,:-f2=<0.5,写入(“类3”)。
检查f2(f2,F3,F4):-f2>0.5,检查F4(F4,F3)。
检查f4(f4,):-f4=<0.5,写入(“类2”)。
检查f4(f4,F3):-f4>0.5,检查f3x(F3)。
检查f3x(F3):-F3=<0.5,写入(“类2”)。
检查f3x(F3):-F3>0.5,写入(“0级”)。

我在SWI Prolog中没有得到那个错误,但我得到了“单例变量:[FEATURE_1,FEATURE_5]”

请注意,所写的表达式与从缩进中得出的预期含义不一致:

第一个
(功能3之前的一个)是“最上面的”函子名称。这可以通过
write\u canonical/2
打印正文来(笨拙地)确定:

?-编写规范((
|特征_0=<37.95->
|特征_3=<0.5->
|书写(“第3类”)
|;功能_3>0.5->
|书写(“第1类”)
|;特征0>37.95->
|特征_2=<0.5->
|书写(“第3类”)
|;特征_2>0.5->
|特征_4=<0.5->
|书写(“第2类”)
|;功能_4>0.5->
|特征_3=<0.5->
|书写(“第2类”)
|;写入(“0类”))。
其中给出(手动重新格式化):

;(>(=(=(>(B,0.5),写入(“类1”),
5944。
检查f3(f3):-f3=<0.5,写入(“类3”)。
检查f3(f3):-f3>0.5,写入(“类1”)。
检查f2(f2,,,,:-f2=<0.5,写入(“类3”)。
检查f2(f2,F3,F4):-f2>0.5,检查F4(F4,F3)。
检查f4(f4,):-f4=<0.5,写入(“类2”)。
检查f4(f4,F3):-f4>0.5,检查f3x(F3)。
检查f3x(F3):-F3=<0.5,写入(“类2”)。
检查f3x(F3):-F3>0.5,写入(“0级”)。

您的代码没有按照您期望的方式进行解析(从缩进判断),而是等同于

check(FEATURE_0, FEATURE_1, FEATURE_2, FEATURE_3, FEATURE_4, FEATURE_5) :-
    ( FEATURE_0 =< 37.95 ->
        ( FEATURE_3 =< 0.5 ->
            write("Class 3")
        )
    ; FEATURE_3 > 0.5 ->
        write("Class 1")
    ; FEATURE_0 > 37.95 ->
        ...
    ).

您的代码没有按照您期望的方式进行解析(从缩进判断),而是等效于

check(FEATURE_0, FEATURE_1, FEATURE_2, FEATURE_3, FEATURE_4, FEATURE_5) :-
    ( FEATURE_0 =< 37.95 ->
        ( FEATURE_3 =< 0.5 ->
            write("Class 3")
        )
    ; FEATURE_3 > 0.5 ->
        write("Class 1")
    ; FEATURE_0 > 37.95 ->
        ...
    ).

请为您的谓词提供一个示例问题,如果您提出该问题,请说明结果是什么,并描述您期望的结果。请为您的谓词提供一个示例问题,如果您提出该问题,请说明结果是什么,并描述您期望的结果。感谢您的回答。这是预期的结果。我不知道为什么我的原始代码会出现这个错误。谢谢你的回答。这是正常的。我不知道为什么我的原始代码会出现这个错误。