解析列表中的循环结果

时间:2016-01-28 13:21:51

标签: list recursion prolog

我想解析几十个上下原子的侦听来实现列表清单

示例

List_F =[['F1',a],['F2',a,b],['F3',a,b,c]|...]

预期结果

is_lower/1

我有两个谓词is_upper/1error,如果当前原子较低(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; } ,但我不知道我应该把它放在哪里

如果对这个谓词有一些改进,请提示他们

1 个答案:

答案 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, []).