列表中的Prolog约束

时间:2013-11-28 20:46:05

标签: prolog

我在prolog中有一个问题,它需要所有可能的四个元素列表的排列(一个元素可以是1,2或X)但我必须在该列表中添加2个约束。它的最后一个元素不能是符号" X"并且排列不能包含符号" 1"超过2次。我不确定在哪里以及如何设置这些限制。任何人都可以给我一些想法吗?

domains
    elem=symbol
    list=elem*

predicates
    elimin(elem,list,list)
    perm(list,list)


clauses
    elimin(H,T,[H|T]).
    elimin(H,[A|T],[A|X]):-
            elimin(H,T,X).
    perm([],[]).
    perm([H|T],X):-
        perm(T,T1),
        elimin(H,T1,X).

当前代码:

    domains
        elem=symbol
        list=elem*

    predicates
        valid(list)
        generate(list)
        count(list,elem,integer)
        member(symbol,list)
    clauses
        valid(S):- 
            generate(S),count(S,1,C),C<2.

        generate([A,B,C,D]) :-
            member(A,["1","2","X"]),
            member(B,["1","2","X"]),
            member(C,["1","2","X"]),
            member(D,["1","2"]).
    member(X,[X|_]).
    member(X,[_|T]):- member(X,T).      
    count([],_,0).
        count([H|T],X,C):- H<>X,
                count(T,X,C).
        count([H|T],X,C1):- H=X,
                count(T,X,C),
                C1=C+1.

1 个答案:

答案 0 :(得分:2)

从你的评论来看,显然你的烫发/ 2是没用的。

显而易见的方法是使用仅接受有效序列的过滤器加入生成器。 如果发电机避免将1置于最后位置,则程序计数/ 3就足够了。 使用非确定性成员/ 2可以很容易地编写生成器。

注意:将常量保持为小写(x而不是X)非常方便。

valid(S) :- generate(S), count(S,1,C), C < 2.

generate([A,B,C,D]) :-
    member(A,[1,2,x]),
    member(B,[1,2,x]),
    member(C,[1,2,x]),
    member(D,[2,x]).

看看你是否可以自己写数/ 3 ......