我想解析几十个上下原子的侦听来实现列表清单
示例
List_F =[['F1',a],['F2',a,b],['F3',a,b,c]|...]
预期结果
is_lower/1
我有两个谓词is_upper/1
和error
,如果当前原子较低(resp.upper),则返回true,
在这个阶段,我成功地做了这个谓词,但是很少get_functors([],[]).
get_functors([X,Y|Xs],[[X]|Facts]) :- is_lower(X),is_upper(Y),
get_functors(Xs,Facts),!.
get_functors([X,Y|Xs],[[X,Y|Fact]|Facts]) :- is_lower(X),is_lower(Y),
get_functors(Xs,[Fact|Facts]).
get_functors([X,Y|Xs],[[X|Fact]|Facts]) :- is_upper(X),is_lower(Y),
get_functors(Xs,[Fact|Facts]).
,结果重新开始
代码
| ?- get_functors(['F1',a,b,'F2',c,d],L).
L = [['F1',a,b],['F2',c,d]] ? ;
L = [['F1',a],[b],['F2',c,d]] ? ;
L = [['F1',a,b,'F2',c,d]] ? ;
L = [['F1',a,b,'F2',c],[d]] ? ;
L = [['F1',a,b,'F2',c,d]] ? ;
L = [['F1',a,b,'F2'],[c,d]] ? ;
L = [['F1',a,b,'F2'],[c],[d]] ?
yes
测试
Cut "!"
我认为这是因为 synchronized double methodOne() {
return ++a;
}
,但我不知道我应该把它放在哪里
如果对这个谓词有一些改进,请提示他们
答案 0 :(得分:1)
在你展示的解决方案中,如果你发现你正在试图找出削减错误答案的位置,那么逻辑在某处就不正确,因为它允许无效的解决方案。
这对于DCG(明确的子句语法)解决方案来说是一个很好的问题,并且更容易概念化并以这种方式解决:
get_functors(List, Functors) :-
phrase(functor_list(Functors), List).
% An empty functor list results from an empty input
% A functor list [F|T] results from seeing a term F follow by a functor list, T
functor_list([]) --> [].
functor_list([F|T]) --> term(F), functor_list(T).
% A term [F|A] is an upper case atom followed by a list of lower case atoms
term([F|A]) --> [F], { is_upper(F) }, lc_atoms(A).
% Recognize a list of lower case atoms
lc_atoms([]) --> [].
lc_atoms([H|T]) --> [H], { is_lower(H) }, lc_atoms(T).
% Some simple definitions of is_upper and is_lower
is_upper(S) :-
atom_codes(S, [X|_]),
X =< 90, X >= 65.
is_lower(S) :-
\+ is_upper(S).
我把它快速地扔在一起,所以可能还有一些小问题,它留下了一个选择点,但我会将其作为练习留给读者。
以下是一个示例查询:
| ?- get_functors(['F1',a,'F2',a,b,'F3',a,b,c], L).
L = [['F1',a],['F2',a,b],['F3',a,b,c]] ? a
(1 ms) no
<小时/> 您可以在GNU或SWI Prolog中使用
listing
来查看DCG的规范谓词形式:
functor_list([], A, A).
functor_list([A|B], C, D) :-
term(A, C, E),
functor_list(B, E, D).
term([A|B], [A|C], D) :-
is_upper(A),
lc_atoms(B, C, D).
lc_atoms([], A, A).
lc_atoms([A|B], [A|C], D) :-
is_lower(A),
lc_atoms(B, C, D).
is_upper(A) :-
atom_codes(A, [B|_]),
B =< 90,
B >= 65.
is_lower(A) :-
\+ is_upper(A).
这将直接通过以下方式调用:
get_functors(List, Functors) :-
functor_list(Functors, List, []).