替换prolog中的变量

时间:2017-12-14 18:30:04

标签: prolog

在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)。有没有办法做到这一点,或者我将不得不使用不同的方法?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

在Prolog中,一旦变量在给定的谓词子句中被实例化(分配了特定值),除非通过回溯,否则不能重新分配变量。换句话说,这总是会失败:

foo(X) :- X = b.

?- X = a, foo(X).

失败是因为ab是两个不同的原子,foo尝试将ab统一起来。如果您只是查询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