以下Prolog中的前缀代码如何工作?
前缀应该返回列表的前缀。 例如:
?-prefix([1,2,3],X)
(我不确定它是否应该写成相反的:前缀(X,[1,2,3]) 将返回[],然后[1],然后[1,2] ......
代码:
prefix(Xs,Ys):- append(Xs,_,Ys).
append([],Xs,Xs).
append([X|Xs],Ys,[X,Zs]):-append(Xs,Ys,Zs).
有人可以运行一个例子吗? (附加只添加两个字符串)
答案 0 :(得分:1)
编写谓词的正确方法是:
prefix(Xs, Ys) :- append(Ys, _, Xs).
这说明 Ys
是Xs
的前缀,如果Ys
附加了其他一些列表(我不在乎它是什么)Xs
1}}
现在在prolog中,当您发出查询(例如append
)并且谓词是相关定义的时,它将尝试查找使查询为TRUE的所有解决方案。如果我有查询append(Ys, _, [1,2,3])
,prolog可以通过Ys
和[]
_
实例化[1,2,3]
来实现这一点(从而产生解决方案,{{ 1}}。然后它会回溯并找到另一个解决方案:Ys = []
是Ys
而[1]
是_
。依此类推......
因此,当您运行查询时,您会得到:
[2,3]
请记住,Prolog试图通过检查事实和规则以及实例化变量来找到解决方案。如果有多种方法来实例化变量,它将会回溯。如果回溯发现另一组使查询成立的变量实例化,Prolog会将其显示为解决方案。如果有更多的回溯可用,它会提示您更多(并输入| ?- prefix([1,2,3], X).
X = [] ? ; % append([], [1,2,3], [1,2,3]); X = [], _ = [1,2,3]
X = [1] ? ; % append([1], [2,3], [1,2,3]); X = [1], _ = [2,3]
X = [1,2] ? ; % append([1,2], [3], [1,2,3]); X = [1,2], _ = [3]
X = [1,2,3] % append([1,2,3], [], [1,2,3]); X = [1,2,3], _ = []
说要给我下一个)。