prolog中带有append的前缀-它是如何工作的?
Prolog中前缀的以下代码是如何工作的 prefix应该返回列表的前缀。 例如:prolog中带有append的前缀-它是如何工作的?,prolog,Prolog,Prolog中前缀的以下代码是如何工作的 prefix应该返回列表的前缀。 例如: ?-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). 任何人都可以运行一个示例吗?(append只添加了两个字符串
?-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).
任何人都可以运行一个示例吗?(append只添加了两个字符串)编写谓词的正确方法是:
prefix(Xs, Ys) :- append(Ys, _, Xs).
这说明的是Ys
是Xs
的前缀,如果Ys
附加了一些其他列表(我不在乎它是什么)是Xs
现在在prolog中,当您发出一个查询,例如append
,并且谓词是以关系方式定义的,它将尝试找到使查询为真的所有解决方案。如果我有一个查询,append(Ys,[1,2,3])
,prolog可以通过使用[]
实例化Ys
,并使用
实例化
,来实现这一点[1,2,3](从而产生解决方案,Ys=[]
。然后它将回溯并找到另一个解决方案:Ys
是[1]
和
是[2,3]
。等等
因此,当您运行查询时,您会得到:
| ?- 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], _ = []
请记住,Prolog通过检查事实和规则以及实例化变量来寻找解决方案。如果实例化变量的方法不止一种,它将回溯。如果回溯找到另一组使查询为真的变量实例化,Prolog会将其显示为解决方案。如果有更多回溯可用,它会提示y您需要更多信息(并输入
;
表示给我下一个)。变量必须以大写开头,否则它们不是变量。为什么您更改了append(Ys,u,Xs)中Xs和Ys的顺序?@Shiran,因为append就是这样工作的。您正在寻找一个列表(Ys
),当追加到另一个列表(
)在append
中,根据您定义的前缀(Xs,Ys)的方式,生成给定的列表Xs
要工作,Xs
必须是追加操作的结果,Ys
必须是被追加的第一个列表。因此,它们的顺序是相反的。我给出的示例说明说明说明说明了这一点。我可以执行前缀(Xs,Ys):-append(Xs,Ys)。
,但接下来我必须查询as,前缀(X,[1,2,3]).
这不是您要求的工作方式。