2016-11-23 46 views
1

如何在列表中创建一个术语,例如:3 * y * w * t^3:List = [3,*,y,...]而不使用以下谓词:如何在Prolog中将术语转换为列表

t2l(Term, List) :- 
    t2l_(Term, List-X), 
    X = []. 
t2l_(Term, [F|X]-X) :- 
    Term =.. [F], 
    !. 
t2l_(Term, L1-L4) :- 
    Term =.. [F, A1, A2], 
    t2l_(A1, L1-L2), 
    L2 = [F|L3], 
    t2l_(A2, L3-L4). 

有没有简单的方法?

回答

1

在Prolog,这可以通过模式匹配应该通过模式匹配 表达来表达一切。

在你的情况,这是困难的,因为你不能统一用图案,您使用的是defaulty表示匹配区别于其他方面所产生的整数

在下文中,我没有完全解决的任务给你,但我展示如何可以解决这个问题,一旦你有一个干净的表示

正如序言描述列表时总是考虑使用符号:

 
term_to_list(y) --> [y]. 
term_to_list(w) --> [w]. 
term_to_list(t) --> [t]. 
term_to_list(i(I)) --> [I]. 
term_to_list(A * B) --> 
     term_to_list(A), 
     [*], 
     term_to_list(B). 
term_to_list(A^B) --> 
     term_to_list(A), 
     [^], 
     term_to_list(B). 

在这个例子中,我使用i(I)象征性代表整数  I

样品的查询和结果:

 
?- phrase(term_to_list(i(3)*y*w*t^i(3)), Ls). 
Ls = [3, *, y, *, w, *, t, ^, 3]. 

我离开defaulty表示转换到一个干净的一个作为一个简单练习。

0

谢谢你的回答,我忘了关闭这个问题。但是我已经创建了一个解决问题的新谓词:

term_string(Term, X), 
string_codes(X, AList), 
ascii_to_list(AList, Y). 

ascii_to_list([X | Xs], [Y | Out]) :- 
    X >= 48, 
    X =< 57, 
    !, 
    number_codes(Y, [X]), 
    ascii_to_list(Xs, Out). 
ascii_to_list([X | Xs], [Y | Out]) :- 
    char_code(Y, X), 
    ascii_to_list(Xs, Out). 
ascii_to_list([], []). 
+1

尝试最普遍的查询:' - term_list(期限,列表).'这使您只有一个* *答案,其省略了许多有效的解决方案。使用我发布的版本,您可以使用:'? - phrase(term_to_list(T),Ls).'和**根据需要生成许多有效答案。我强烈建议尽可能使程序尽可能通用,以便真正从声明范例中受益。 – mat