【问题标题】:Prolog constraints in a list列表中的 Prolog 约束
【发布时间】:2013-11-29 23:55:52
【问题描述】:

我在序言中有一个问题,它需要四个元素列表的所有可能排列(一个元素可以是 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 你就剩下 3 个元素需要置换?
  • 对这些条件写测试,你会发现你已经写好了代码。
  • 第二个条件没有意义。如果排列不能包含超过两次的“1”,则原始列表也不能。
  • @SQB 我更新了要求。我应该在该列表中找到的唯一值是 1,2 和 X。所以可能有像 [2,2,2,2] 或[1,1,1,1]。
  • 那么你不是在寻找排列。

标签: prolog


【解决方案1】:

从您的评论来看,您的 perm/2 显然没用。

显而易见的方法是将生成器与只接受有效序列的过滤器连接起来。 如果生成器避免将 1 放在最后一个位置,则过程 count/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]).

看看你能不能自己写count/3...

【讨论】:

  • count([],X,0). count([H|T],X,C):- H=X, C=C+1, count(T,X,C) 可以吗?
  • 你错过了'else'分支,当H\=X。然后计数将失败...并且无法重新分配给C。使用C1 is C+1
  • count([],X,0). count([H|T],X,C):- H=X, C is C+1, count(T,X,C). count([H|T],X,C):- H\=X,count(T,X,C). 好的,我想现在应该可以了,对吧?
  • 应该是count([H|T],X,C1):- H=X, count(T,X,C), C1 is C+1.
  • 试过了,它说给出了“未声明的谓词或拼写错误”,将光标定位在C1 is C+1的C1下我用当前代码更新了帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多