【发布时间】:2018-01-21 21:12:04
【问题描述】:
我正在尝试编写一个谓词,如果变量X 和谓词f(X) 都是输入列表L 的元素,则返回1,如果其中至少一个缺失,则返回0。
这是谓词应该做的:
?- f_in_list([X, f(X)], Val).
should return Val = 1
?- f_in_list([X, f(Y), Z], Val).
should return Val = 0, as X and Y are different variables.
我写了这个简单的代码:
f_in_list(L, 1) :-
member(X, L),
member(f(X), L),
!.
f_in_list(_, 0).
我的问题是 Prolog 总是试图统一输入变量,所以它分别返回 X = f(X) 和 X = f(Y)。
我尝试使用dif(X, f(X)) 来规避这个问题,但即使这样也没有用。如果列表包含至少两个元素,Val 将始终为 1。
有没有办法将变量转换为原子或字符串,所以Prolog无法统一变量?或者更好的是,有没有办法防止同名变量的统一?
【问题讨论】:
-
由于您只需要检测
X和f(X),因此可以将它们写为x和f(x)。然后你可以提供这样的列表[x, f(x), z](使用常量而不是变量)。 -
遗憾的是我不能这样做,因为该程序需要特定类型的输入。如果有一种方法可以自动为我的输入变量分配成对不同的常量,这将起作用。
-
您以什么方式尝试使用
dif/2?我有兴趣看到这种尝试的解决方案。
标签: prolog