prolog代码中的类型不匹配

prolog代码中的类型不匹配,prolog,Prolog,我写了一条规则如下: rule_1561_cctype([],_,_,_). rule_1561_cctype([X1|Y1],[Ru1|Ru1T],[Ru2|Ru2T],[Ru3|Ru3T]):- X1 is 0 -> Ru1 in {2,3,4}, Ru2 in {-1}, Ru3 in {-1} ;X1 is 1 -> Ru1 in {2,3,4}, Ru2 in {2,3,4}, Ru3 in {-1} ;X1 is 2 -> Ru1 in {2},

我写了一条规则如下:

rule_1561_cctype([],_,_,_).
rule_1561_cctype([X1|Y1],[Ru1|Ru1T],[Ru2|Ru2T],[Ru3|Ru3T]):-
    X1 is 0 -> Ru1 in {2,3,4}, Ru2 in {-1}, Ru3 in {-1}
    ;X1 is 1 -> Ru1 in {2,3,4}, Ru2 in {2,3,4}, Ru3 in {-1}
  ;X1 is 2 -> Ru1 in {2}, Ru2 in {2}, Ru3 in {2}
  ;rule_1561_cctype(Y1,Ru1,Ru2,Ru3),!.
rule_1561_cctype(CctypeInt, Ru1, Ru2,Ru3),
我将此规则称为如下规则:

rule_1561_cctype([],_,_,_).
rule_1561_cctype([X1|Y1],[Ru1|Ru1T],[Ru2|Ru2T],[Ru3|Ru3T]):-
    X1 is 0 -> Ru1 in {2,3,4}, Ru2 in {-1}, Ru3 in {-1}
    ;X1 is 1 -> Ru1 in {2,3,4}, Ru2 in {2,3,4}, Ru3 in {-1}
  ;X1 is 2 -> Ru1 in {2}, Ru2 in {2}, Ru3 in {2}
  ;rule_1561_cctype(Y1,Ru1,Ru2,Ru3),!.
rule_1561_cctype(CctypeInt, Ru1, Ru2,Ru3),
其中,CctypeInt是整数列表

但我得到一个错误如下:

      935      9 Call: rule_1561_cctype(dom(0..2),dom({-1}\/(2..4)),dom({-1}\/(2..4)),dom({-1}\/(2..4))) ? 
! Type error in argument 2 of = /2
! integer expected, but [] found
! goal:  _310957=[]
      935      9 Exception: rule_1561_cctype(dom(0..2),dom({-1}\/(2..4)),dom({-1}\/(2..4)),dom({-1}\/(2..4))) ? 

我哪里错了吗?

你在做约束逻辑编程,对吗?问题在于,Prolog试图将一个数值范围内的受约束变量与一个空列表统一起来,并报告一个错误


查看您的代码,我假设对ruleؙcctype(Y1,Ru1,Ru2,Ru3)的调用应该是ruleؙcctype(Y1,Ru1T,Ru2T,Ru3T)。

您使用的是哪个Prolog?这可能是一个可视化的序言吗?似乎
rule\u 1561\u cctype
的第一个参数应该是一个列表。但是在您的通话中,您传递了一个术语
dom(..)
。我不认识这一点,也没有在Sicstus手册中找到定义。更重要的是,您的第二个参数将该构造与
\/
运算符相结合,该运算符被定义为一个内置的标准运算符,用于接受两个整数的按位析取。我猜您给出的表达式被解析为按位求反
`应用于
/2`,但后者不是整数。也许您需要在调用之前对这些表达式求值。可能您需要的是使用约束运算符,如
\/
,而不是
\/
。很好,tail调用几乎肯定需要处理列表的尾部。但错误消息似乎指向有限域约束表达式的“目标扩展”中发生的某些事情。不幸的是,OP还没有明确说明您做了什么,这涉及到约束逻辑编程。