首页 > 解决方案 > 如何从字符串创建匿名变量?

问题描述

我已经定义了一个谓词find_word/2,当给定一个字母列表(有些字母可能没有接地)时,会产生与列表中给出的模式匹配的可能单词。这有点像刽子手求解器。

word('entity', n, 11).
word('physical entity', n, 1).
word('abstraction', n, 0).
% ... and 200,000 more entries ...

% Example: find_word([_,o,u,n,t,r,y], X) -> X = country
find_word(LetterList, Word) :-
    word(Word, _, _),
    atom_chars(Word, LetterList).

上面的代码按预期工作。挑战在于,我从 Prolog 系统外部接收到作为字符串(例如app_e)的刽子手问题,其中字符串中的下划线表示上面的 prolog 程序要找到的缺失字母。即我需要将app_e字符串转换为可以输入的列表find_word/2

在我的第一次尝试中,我使用了atom_chars\2

?- atom_chars(app_e, L), find_word(L, Word).

不幸的是,这并没有按预期工作,因为atom_chars(app_e, L)-> L = [a, p, p, '_', e]。即'_'不是通配符。

总而言之,给定一个字符串app_e,我如何将其转换为可以输入的列表find_word\2以达到与 相同的效果find_word([a,p,p,_,e], Word).

标签: prolog

解决方案


我认为atom_chars/2在这里按预期工作,您只需要一个小清理步骤即可完成将输入转换为所需形式,我认为您可以像这样直接完成:

charvar('_', _).
charvar(C, C) :- C \= '_'.

用法如下所示:

?- maplist(charvar, [a,p,p,'_',e], X).
X = [a, p, p, _3398, e] .

不用担心这个变量没有呈现为下划线;你自己的可能也不是:

?- X=[_].
X = [_3450].

推荐阅读