prolog - 替换 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) 。有什么办法可以做到这一点还是我必须使用不同的方法?

感谢您提供的任何帮助。

最佳答案

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

foo(X) :- X = b.

?- X = a, foo(X).

它失败了,因为 ab 是两个不同的原子,并且 foo 试图将 ab。如果您只是查询 foo(a),这一点会更清楚地看到。 foo 如何可能将 b 的值重新绑定(bind)到原子 a ?根本没有意义。

一个基本问题是您的谓词试图以两种不同的方式处理单个变量。解决此问题的一种方法是重构 whatgender ,使其在两种情况下含义相同。我们可以通过使用两个参数来做到这一点:

whatgender(X, X) :-
    gen(X).
whatgender(X, Y) :-
    gender(Y, Out),
    member(X, Out).

现在,whatgender(X, Y) 表示 YX 所代表的特定性别。第一个子句是简单的情况。

但这意味着,如果您从 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/

相关文章:

prolog - 如何通过序言在Akari中寻找细胞的邻居

prolog - 写入文件 | Swi-Prolog | window

prolog - 退出 SWI Prolog 中的所有错误

module - 为什么 prolog 的 ISO 模块标准失败了?

prolog - 如何处理序言列表?

binding - Prolog中变量的几种绑定(bind)选项

Prolog 兼容层 - 可用的编程库

if-statement - Prolog if-then-else 构造 : -> vs *-> vs. if_/3

prolog - Prolog中的结构化对象是什么意思

prolog - 康威生命游戏最简洁的序言实现是什么?