List 不带函子的prolog项

List 不带函子的prolog项,list,prolog,List,Prolog,我面临一个关于列表和术语的序言问题。那么我的问题是如何写谓词 transform([a,b],X) 将返回X=(a,b),反之亦然 这对我来说很奇怪,因为我以前从未遇到过这样的术语。我试过内置=。。但是 =..((a,b,c,d),X) 返回X=[',',a,(b,c,d)],这让我非常失望。 谢谢。检查以下内容: transform([A], A):- A=..[_]. transform([A,B], (A,B)):- B=..[_]. transform([A,B,C|Tail

我面临一个关于列表和术语的序言问题。那么我的问题是如何写谓词

transform([a,b],X)
将返回X=(a,b),反之亦然

这对我来说很奇怪,因为我以前从未遇到过这样的术语。我试过内置=。。但是

=..((a,b,c,d),X)
返回X=[',',a,(b,c,d)],这让我非常失望。
谢谢。

检查以下内容:

transform([A], A):-
  A=..[_].
transform([A,B], (A,B)):-
  B=..[_].
transform([A,B,C|Tail], L):-
  L=..[',',A,T],
  transform([B,C|Tail], T).
仅当需要转换([Item],Item)时才需要第一个子句


请注意,您正在构建的术语确实有一个函子,它是“,”/2,并且显示在您看到的括号中。

是否希望此方法适用于列表中任意数量的元素?是的,它应适用于任意数量的元素。事实上,我无法理解=…((a,b,c,d),X)的返回X=[',',a,(b,c,d)]。对我来说,它应该是X=[',',a,b,c,d]它的行为类似于一个列表,有一个头部,另一个列表有一个尾部。换句话说,
(a,b,c,d)=(a,(b,(c,d))
。为什么在那里有两次
L=..[',',,a,T]
的可能重复项?它应该是第一个。我去掉了第二个。谢天谢地,我没有意识到(a,b)是,(a,b),因为=…((a,b,c),X)给出了X=[',',,a,(b,c)],这对我来说很奇怪(我原以为X会是[',',,a,b,c])。然后我就认为它是空的(a,b),并因此失去了谷歌一天的时间。谢谢gusbro,第二件事是=../2对2元谓词和2元以上谓词给出不同的答案,如22?-X=..[',',s,d]。X=(s,d)。23?-X=…[',',s,d,m]。X=','(s,d,m)。为什么:(当你使用
(a,b,c)=…L
时,它会给你
[',',,a,(b,c)]
,因为主函子是,/2,第一个参数
a
,第二个参数
,(b,c)
,显示为
(b,c)
?- transform([a,b], X).
X = (a, b) 

?- transform([a,b,c,d,e,f], X).
X = (a, b, c, d, e, f) 

?- transform(L, (a,b,c,d,e,f,g))
L = [a, b, c, d, e, f, g]