Prolog完成列表中缺少的元素

时间:2014-05-17 09:02:10

标签: list prolog

假设我有5个无法在列表中重复的元素: 要素是:

team(portugal).
team(england).
team(usa).
team(france).
team(spain).

我有这个清单:[团队(法国),团队(西班牙),团队(葡萄牙),_,团队(英格兰)] 如你所见,团队(美国)失踪了。我该如何添加它? 我有这个谓词可用:

put(TEAM,one,[TEAM,_,_,_,_]). %etc, for other positions

我试图:

complete(List,CompleteList):-
team(X),member(team(X)),List),put(team(X),_,List).

3 个答案:

答案 0 :(得分:0)

你可能在程序方面考虑得太多,而在谓词方面则不够。

似乎您需要一个谓词is_complete/1,以便is_complete(List)为真,当且仅当List是包含所有团队的列表时,才会出现一次。这可以通过以下方式实现:

is_complete(List) :-
    setof(X,team(X),Teams),
    length(Teams,N),
    length(List,N),
    foreach(team(X),member(X,List)).

然后,您可以回溯is_complete(L)以获得您团队的所有可能排列。您可以检查列表是否完整:

is_complete([portugal, england, france, spain, usa]).

是真的,或用它来完成团队:

?- L=[portugal, england, T1, T2, usa], is_complete(L).
L = [portugal, england, france, spain, usa],
T1 = france,
T2 = spain ;
L = [portugal, england, spain, france, usa],
T1 = spain,
T2 = france ;
false.

答案 1 :(得分:0)

给你这个事实:

Team = [team(france),team(spain),team(portugal),_,team(england)].

然后你必须这样做才能将team(usa)放入列表中:

?- Team = [team(france),team(spain),team(portugal),_,team(england)],
    member(team(usa),Team),
    write(Team).

然后我明白了:

[team(france),team(spain),team(portugal),team(usa),team(england)]

答案 2 :(得分:0)

由于您的原始列表包含变量,因此您可以在不使用"结果的情况下实例化它们。列表:

complete(List) :-
    complete(List, []).
complete([], _).
complete([team(X)|T], A) :-
    team(X),
    \+ memberchk(team(X), A),
    complete(T, [team(X)|A]).

| ?- Team = [team(france),team(spain),team(portugal),_,team(england)], complete(Team).

Team = [team(france),team(spain),team(portugal),team(usa),team(england)] ? ;

(1 ms) no

它也适用于多个"空白"在列表中。

<小时/> 如果您想保持原始列表的完整性,可以这样做:

complete(List, CompleteList) :-
    complete(List, [], CompleteList).

complete([], _, []).
complete([H|T], A, [team(X)|C]) :-
    (   ground(H)
    ->  H = team(X)
    ;   true
    ),
    team(X),
    \+ memberchk(team(X), A),
    complete(T, [team(X)|A], C).

这将保留初始列表:

| ?- Team = [team(france),team(spain),team(portugal),_,team(england)], complete(Team, C).

C = [team(france),team(spain),team(portugal),team(usa),team(england)]
Team = [team(france),team(spain),team(portugal),_,team(england)] ? ;

(1 ms) no
| ?-