如何使用一系列事实限制Prolog中参数的值?

如何使用一系列事实限制Prolog中参数的值?,prolog,Prolog,我想将查询属性(X,use,Y)限制为列表[a,b,c]中Y的值。 c/1仅适用于Y的值。 我原以为下面的方法行得通,但行不通 c(a). c(b). c(c). property(X, use, Y). c(Y). 以下语句仅产生false person(1). property(1, use, _). 我在使用Problog,但我没有在这里使用任何Problog函数,所以我想我误解了关于统一的一些东西 我认为c(Y)将生成列表,并且Y将在所有事实中统一 更新 这似

我想将查询
属性(X,use,Y)
限制为列表
[a,b,c]
Y
的值。
c/1
仅适用于
Y
的值。 我原以为下面的方法行得通,但行不通

c(a).
c(b).
c(c). 

property(X, use, Y).
c(Y).
以下语句仅产生
false

     person(1).
     property(1, use, _).
我在使用Problog,但我没有在这里使用任何Problog函数,所以我想我误解了关于统一的一些东西

我认为
c(Y)
将生成列表,并且
Y
将在所有事实中统一

更新 这似乎是Problog特有的问题,如下所示

substance(methadone). 
substance(heroin).

P::property(X,use,nicotine) :-  %doesn't work
    property(X,use,Z),
    substance(Z),
    P is 0.8.

property(X,use,nicotine) :-  %works
    property(X,use,Z),
    substance(Z).

person(1).
substance(Y).
property(1, use, Y).
你可以写:

property(_X, use, Y) :-
    c(Y).
你可以写:

property(_X, use, Y) :-
    c(Y).
person(1)
生成false,因为没有关于任何
person/1
的规则(实际上没有事实)。另一方面,
property(1,use,Y)
应该成功,因为它与
property(X,use,Y)
相结合,
person(1)
产生false,因为没有关于任何
person/1的规则(实际上没有事实)。另一方面,
property(1,use,Y)
应该成功,因为它与
property(X,use,Y)
。。。