prolog - 如何从字符串创建匿名变量?
问题描述
我已经定义了一个谓词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).
?
解决方案
我认为atom_chars/2
在这里按预期工作,您只需要一个小清理步骤即可完成将输入转换为所需形式,我认为您可以像这样直接完成:
charvar('_', _).
charvar(C, C) :- C \= '_'.
用法如下所示:
?- maplist(charvar, [a,p,p,'_',e], X).
X = [a, p, p, _3398, e] .
不用担心这个变量没有呈现为下划线;你自己的可能也不是:
?- X=[_].
X = [_3450].
推荐阅读
- react-native - 开玩笑地使用 async/await 调用 api 总是得到状态 200
- cmake - 我通过 apt-get 安装了 libsdl2-image-dev,但 cmake 找不到它
- javascript - UnhandledPromiseRejectionWarning: SyntaxError: React Native
- ajax - checkmarx Client_Reflected_File_Download
- javascript - 仅处理数组中的按下项目
- laravel - Laravel 通过 href 发送数据
- testing - Flutter:测试未来的构建器
- c# - 我需要通过解析 Json 后得到的循环计算值的总数,但不能使其与控制台应用程序一起使用)
- c++ - Doxygen - 如何在不生成图表的情况下生成文本调用关系结果
- c# - UniRx 中的 UpdateAsObservable() 与 EveryUpdate()?