我定义了一个谓词v[v.length()]
,当给定一个字母列表(某些字母可能不接地)时,将产生与列表中给出的模式匹配的可能单词。这有点像hangman求解器。
find_word/2
上面的代码按预期工作。面临的挑战是,我从Prolog系统外部以字符串形式(例如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).
)接收到hangman问题,其中字符串中的下划线表示上面的prolog程序找不到的字母。也就是说,我需要将app_e
字符串转换为可以放入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
相同的效果?
答案 0 :(得分:3)
我认为atom_chars/2
可以按此处的预期工作,您只需要执行一些清理步骤即可完成将输入内容转换为所需形式的操作,我想您可以像这样直接进行操作:
charvar('_', _).
charvar(C, C) :- C \= '_'.
用法如下:
?- maplist(charvar, [a,p,p,'_',e], X).
X = [a, p, p, _3398, e] .
不必担心该变量不会被显示为下划线;您自己可能不会:
?- X=[_].
X = [_3450].