在序言中我有两条规则 gender(male,[man,boy]).
和gender(female,[woman,girl]).
以及 gen(female)
和gen(male)
。然后我传入一个变量来查看用户输入的内容,如下所示:
whatgender(X):-
gen(X).
whatgender(X):-
gender(Pass,Out),
member(X,Out).
Pass
现在就是我想要的X
成为。不幸的是,由于我在此之后操作它的方式,我需要变量为 X 并且无法为 Out 创建另一个变量,例如whatgender(X,Pass)
。有什么办法可以做到这一点还是我必须使用不同的方法?
感谢您提供的任何帮助。
最佳答案
在 Prolog 中,一旦变量在给定的谓词子句中实例化(分配特定值),就无法重新分配,除非通过回溯。换句话说,这总是会失败:
foo(X) :- X = b.
?- X = a, foo(X).
它失败了,因为 a
和 b
是两个不同的原子,并且 foo
试图将 a
与 b
。如果您只是查询 foo(a)
,这一点会更清楚地看到。 foo
如何可能将 b
的值重新绑定(bind)到原子 a
?根本没有意义。
一个基本问题是您的谓词试图以两种不同的方式处理单个变量。解决此问题的一种方法是重构 whatgender
,使其在两种情况下含义相同。我们可以通过使用两个参数来做到这一点:
whatgender(X, X) :-
gen(X).
whatgender(X, Y) :-
gender(Y, Out),
member(X, Out).
现在,whatgender(X, Y)
表示 Y
是 X
所代表的特定性别。第一个子句是简单的情况。
但这意味着,如果您从 X
开始并且它绑定(bind)到一个值,那么您需要将其“映射”到特定性别 Y
,您现在需要使用 Y
来实现此目的(“特定”性别)。
% Code using X (more general value but specifically bound)
whatgender(X, Y),
% Code using X for more general, but Y for the specific gender
根据我最初的评论,你绝对不能这样做:
% Code using X (more general value but specifically bound)
whatgender(X), % "assign" a new value to X
% THIS IS NOT POSSIBLE
关于prolog - 替换 prolog 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47819940/