Tuple term建设与,/2
PROLOG 中的运算符通常是右结合的(通常称为sequence),所以你的输入a, b(c), d(e(f)), g
实际上很可能是这个词(a, (b(c), (d(e(f)), g)))
。您的谓词这一事实证明了这一点test2/1
打印您的问题中显示的内容,在第一次调用第一个子句时test2/1
, X
匹配的a
and Xs
匹配的(b(c), (d(e(f)), g))
,然后在第二次调用时X
匹配的b(c)
and Xs
匹配的(d(e(f)), g)
, 等等。
如果你真的想处理一个list对于解释为连词的术语,您可以使用以下内容:
test2([X|Xs]) :- write(X), nl, test2(Xs).
test2([]).
...输入时[a, b(c), d(e(f)), g]
。这里的列表结构通常与使用构造的元组解释略有不同,/2
(至少在 SWI-PROLOG 中,这样的结构是处理由./2
与构造序列或元组项的方式大致相同,/2
)。这样,如果您可以允许列表术语,您将获得列表术语支持的好处解释为连词在你的代码中。另一种选择是声明并使用您的own(可能是中缀运算符)用于连接,例如&/2
,您可以将其声明为:
:- op(500, yfx, &). % conjunction constructor
然后你可以将你的连接构造为a & b(c) & d(e(f)) & g
并从那里适当地处理它,确切地知道你的意思&/2
- 连词。
请参阅手册页op/3 http://www.swi-prolog.org/pldoc/man?predicate=op/3在 SWI-PROLOG 中了解更多详细信息 - 如果您不使用 SWI,我认为您使用的任何 PROLOG 实现中都应该有一个类似的谓词 - 如果它值得的话那就是盐:-)
EDIT:转换使用构造的元组术语,/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]).