gpt4 book ai didi

prolog - 在 Prolog 中匹配元组

转载 作者:行者123 更新时间:2023-12-04 06:52:42 24 4
gpt4 key购买 nike

为什么Prolog匹配(X, Xs)使用包含更多元素的元组?一个例子:

test2((X, Xs)) :- write(X), nl, test2(Xs).                                    
test2((X)) :- write(X), nl.

test :-
read(W),
test2(W).

?- test.
|: a, b(c), d(e(f)), g.
a
b(c)
d(e(f))
g
yes
实际上,这就是我想要实现的目标,但似乎很可疑。有没有其他方法可以将术语的连接视为 Prolog 中的列表?

最佳答案

元组项构造与 ,/2运算符在 PROLOG 中通常是右结合的(通常称为序列),因此您输入的 a, b(c), d(e(f)), g实际上很可能是术语 (a, (b(c), (d(e(f)), g))) .您的谓词 test2/1 证明了这一点。打印了您的问题中显示的内容,在第一次调用 test2/1 的第一个子句时的位置, X匹配 aXs匹配 (b(c), (d(e(f)), g)) ,然后在第二次调用 X匹配 b(c)Xs匹配 (d(e(f)), g) , 等等。

如果您真的想处理解释为连词的术语列表,您可以使用以下内容:

test2([X|Xs]) :- write(X), nl, test2(Xs).                                    
test2([]).

...在输入 [a, b(c), d(e(f)), g] .这里的列表结构通常与用 ,/2 构造的元组有点不同。 (因为,至少在 SWI-PROLOG 中,这样的结构是处理用 ./2 构造的术语的语法糖,方式与您用 ,/2 构造序列或元组术语的方式大致相同)。这样,如果您可以允许将列表术语解释为代码中的连接词,您就可以获得列表术语支持的好处。另一种选择是声明并使用您自己的(可能是中缀运算符)进行连接,例如 &/2 ,您可以声明为:
:- op(500, yfx, &). % conjunction constructor

然后你可以将你的合取构造为 a & b(c) & d(e(f)) & g并从那里适本地处理它,确切地知道您的意思 &/2 - 结合。

请参阅 op/3 的手册页在 SWI-PROLOG 中了解更多详细信息 - 如果您不使用 SWI,我认为在您使用的任何 PROLOG 实现中都应该有一个类似的谓词 - 如果值得的话 :-)

编辑:转换使用 ,/2 构造的元组项对于列表,您可以使用以下内容:
conjunct_to_list((A,B), L) :-
!,
conjunct_to_list(A, L0),
conjunct_to_list(B, L1),
append(L0, L1, L).
conjunct_to_list(A, [A]).

关于prolog - 在 Prolog 中匹配元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2893766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com