假设我有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).
答案 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
| ?-