在prolog中,我有两个规则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)
。有没有办法做到这一点,或者我将不得不使用不同的方法?
感谢您提供的任何帮助。
答案 0 :(得分:3)
在Prolog中,一旦变量在给定的谓词子句中被实例化(分配了特定值),除非通过回溯,否则不能重新分配变量。换句话说,这总是会失败:
foo(X) :- X = b.
?- X = a, foo(X).
失败是因为a
和b
是两个不同的原子,foo
尝试将a
与b
统一起来。如果您只是查询foo(a)
,则会更清楚地看到这一点。 foo
如何将b
的值重新绑定到原子a
?它甚至没有意义。
一个基本问题是你的谓词试图以两种不同的方式处理单个变量。解决这个问题的一种方法是重构whatgender
,这样在两种情况下都意味着同样的事情。我们可以使用两个参数来做到这一点:
whatgender(X, X) :-
gen(X).
whatgender(X, Y) :-
gender(Y, Out),
member(X, Out).
现在,whatgender(X, Y)
表示Y
是由X
代表的特定性别。第一个条款是微不足道的。
这意味着,如果你从X
开始并且它绑定了一个值,那么你需要将它“映射”到特定的性别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