List Prolog-转换为';反对意见';清单上的术语

List Prolog-转换为';反对意见';清单上的术语,list,prolog,List,Prolog,我希望转换一个类似于以下内容的序言术语: cons(a, cons(b, cons(c, cons(d, nil )))) 进入列表: [a, b, c, d] 我有一个函数来验证cons(a,cons(b,cons(c,cons(d,nil))) 是一个合适的列表,如下所示: list(nil). list(cons(_,X)):- list(X). 这就产生了 ?- list(cons(a, cons(b, cons(c, cons(d, nil ))))). true.

我希望转换一个类似于以下内容的序言术语:

cons(a, cons(b, cons(c, cons(d, nil ))))
进入列表:

[a, b, c, d]
我有一个函数来验证
cons(a,cons(b,cons(c,cons(d,nil)))
是一个合适的列表,如下所示:

list(nil).

list(cons(_,X)):-
    list(X).
这就产生了

?- list(cons(a, cons(b, cons(c, cons(d, nil ))))).
true.
现在,当我传递一个术语,比如,
list(cons(a,cons(b,cons(c,cons(d,nilЮЮЮ))。
,它是真的,我想把它转换成一个列表。剩下的我都能做了,我只是停留在从术语到列表的转换上


如果您能为我指明正确的方向,我们将不胜感激。

一个简单的解决方案是:

list(nil, []).
list(cons(A,X), [A|L]):-
    list(X,L).
例如:

?- list( cons(a, cons(b, cons(c, cons(d, nil )))), L).
L = [a, b, c, d].

我试过一些不同的方法,比如:{create_list(cons(,X),L):-append(,L,L2),L=L2。}这和你的想法一致吗?我想这只是格式问题。在我的代码中有一个下划线,但它没有出现在注释中。Prolog中列表的标准形式恰好是
。(H,t)
,其中
H
是列表的头部,
t
是列表的尾部(或其余部分)。括号符号
[…]
只是一个语法上的“糖”。所以
实际上是Prolog版本的
cons
,因为
[a,b,c,d]
的真正形式是
。(a!非常感谢您抽出时间!