如何在以下列表中转换如下的术语:3 * y * w * t ^ 3:List = [3,*,y,...],而不使用以下谓词:
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).
有简单的方法吗?
答案 0 :(得分:1)
在Prolog中,可以表达的所有内容模式匹配 应通过模式匹配来表达。
在您的情况下,这很难,因为您无法通过与您正在使用的默认表示进行模式匹配来将整数与其他出现的术语区别开来。
在下文中,我并没有完全为您解决任务,但是当您有干净表示时,我正在展示您如何解决它。
在Prolog中描述列表时一如既往,请考虑使用dcg表示法:
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].
我将默认表示转换为干净的表示作为一种简单的练习。
答案 1 :(得分: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([], []).