在prolog中添加前缀 - 它是如何工作的?

时间:2014-04-03 16:19:00

标签: prolog

以下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).

有人可以运行一个例子吗? (附加只添加两个字符串)

1 个答案:

答案 0 :(得分:1)

编写谓词的正确方法是:

prefix(Xs, Ys) :- append(Ys, _, Xs).

这说明 YsXs的前缀,如果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], _ = [] 说要给我下一个)。