prolog中带有append的前缀-它是如何工作的?

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只添加了两个字符串

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(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]).
这不是您要求的工作方式。