Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 如何更改正确单词的拼写错误?_Prolog - Fatal编程技术网

Prolog 如何更改正确单词的拼写错误?

Prolog 如何更改正确单词的拼写错误?,prolog,Prolog,如何正确更改单词的拼写: 示例1: ?-correct([p,c,o,m,t,e,r,u],X) X=[c,o,m,p,u,t,e,r] 示例2: ?-change([u,s,t,e,n,,t,d],X) Y=[ s,t,u,d,e,n,t] 它将如何工作?这就是我在第一个例子中所做的: x([c,o,m,p,u,t,e,r]). y([s,t,u,d,e,n,t]). correct(Word, CorrectWord) :- select(_, Word, CorrectWor

如何正确更改单词的拼写:

示例1:

?-correct([p,c,o,m,t,e,r,u],X)
X=[c,o,m,p,u,t,e,r]
示例2:

?-change([u,s,t,e,n,,t,d],X)
Y=[ s,t,u,d,e,n,t]
它将如何工作?这就是我在第一个例子中所做的:

x([c,o,m,p,u,t,e,r]).
y([s,t,u,d,e,n,t]).

correct(Word, CorrectWord) :-
    select(_, Word, CorrectWord),
    x(CorrectWord).

您需要一个单词的知识库:

word([c,o,m,p,u,t,e,r]).
word([s,t,u,d,e,n,t]).
现在我们需要考虑您希望解决的问题,您想知道
Word
CorrectWord
是否包含完全相同的字母,但顺序不同。因此,我建议在比较之前,先确定相同的顺序:

correct(Word, CorrectWord) :-
    word(CorrectWord),  % Search through the knowledge base of words
    sort(Word, S), sort(CorrectWord, S).  % Compare the two words
sort/2是SWI Prolog的内置程序,比较是通过要求
S
统一到同一事物,即已排序的单词来完成的。此方法的缺点是它不会向后运行,但也不需要更正\2和更改\2。它还允许您提出以下问题:

?- correct([p, c, o, m, t, e, r, u], [c|T]).
T = [o, m, p, u, t, e, r].
对于新的示例案例,
[o,o,n,p,u,t,e,r]
要处理奇数的额外字母,可以使用类似于Jaccard系数的相似性度量<代码>交叉点/3,
长度/2
附加/3
都内置于SWI Prolog中。我使用
append/3
作为联合

jaccard_coef(L1, L2, JC) :-
    intersection(L1, L2, I),
    length(I, LI),
    append(L1, L2, U),
    length(U, LU), 
    JC is LI/LU.
现在您的正确子句变成:

correct(Word, CorrectWord) :-
    word(CorrectWord),  % Search through the knowledge base of words
    sort(Word, S), sort(CorrectWord, S).  % Compare the two words
correct(Word, CorrectWord) :-.
    word(CorrectWord),
    jaccard_coef(Word, CorrectWord, JC),
    JC > 0.4. % Where 0.4 is a number chosen as a threshold.

选择
0.4
,使示例通过。1将需要精确匹配,根据您要求的严格程度进行调整,或者您可以更新该方法以查找最大jaccard_coef,从而仅返回最相似的单词,而不是选择相似的单词。

X(CorrectWord)。`是Prolog中的语法错误。不能有以大写字母开头的函子
X=([c,o,m,p,u,t,e,r)]
(还包括印刷错误)和
Y=[(s,t,u,d,e,n,t)]
在这种情况下也没有意义。它们是未终止的术语和语法错误。是的,我知道,我尝试过,但失败了。我只想用c,m,p,u,t,e,r,我想把它改成这个组件你真的应该先学习基本的,正确的Prolog语法,然后再尝试一个bug问题。我不确定你是否理解我说的话。假设我有“计算机”这个词。这是正确的词,如果我们说有像c,o,m,m,p,u,t,e,r这样的问题,n、 p,u,t,e,r或任何情况下,它可能会使这个单词不符合它应该是的样子,我想和你做比较,并会给我正确的单词。例如,单词或正确的单词有更多的字母。我想做错误的单词,o,m,p,u,r,e,r。这是一个比你在问题中所说的更大的问题。要完成此操作,您需要在
correct/2
谓词中添加几个子句。在新的示例中,
[o,o,n,p,u,t,e,r]
您需要使用一些度量(如Jaccard距离)来查找最接近的匹配正确单词。这不是小事。我不知道你是否明白我的意思,我想在任何情况下,将结果修正一个像o,o,n,p,u,t,e,r之类的词到这台计算机上,这是困难的?更先进?什么?更复杂,我已经更新了答案以包含一个解决方案。