Prolog内部变量名

Prolog内部变量名,prolog,Prolog,我有大量的事实已经在我的文件中(位置(M,p)),M是球员的名字,p是球员的位置,我被要求做一个球员名单(L,N),L是球员名单,N是这个名单的大小。我这样做了,它工作了问题是它给出的列表没有名字,它给我的是数字,而不是名字 player_list([H|T],N):- L = [H|T], position(H,P), \+ member(H,L), append(L,H),

我有大量的事实已经在我的文件中
(位置(M,p))
,M是球员的名字,p是球员的位置,我被要求做一个
球员名单(L,N)
,L是球员名单,N是这个名单的大小。我这样做了,它工作了问题是它给出的列表没有名字,它给我的是数字,而不是名字

player_list([H|T],N):-  L = [H|T],
                   position(H,P),
                   \+ member(H,L),
                   append(L,H),
                   player_list(T,N).
我得到的是:

?- player_list(X,4).
  X = [_9176, _9182, _9188, _9194] .

那我该怎么办

您可以使用附加列表作为参数来跟踪您已经拥有的玩家。此列表开头为空,因此调用谓词调用描述与
[]
的实际关系的谓词作为附加参数:

player_list(PLs,L) :-
   pl_l_(PLs,L,[]).            % <- actual relation
关于您的评论,我假设您的代码包含以下四个事实:

position(zlatan,center).
position(rooney,forward).
position(ronaldo,forward).
position(messi,forward).
然后,您的示例查询将生成所需的结果:

   ?- player_list(X,4).
X = [zlatan,rooney,ronaldo,messi] ? ;
X = [zlatan,rooney,messi,ronaldo] ? ;
...
如果你想反过来使用谓词,我建议使用CLP(FD)。要了解为什么,请考虑最一般的查询:

   ?- player_list(X,Y).
X = [],
Y = 0 ? ;
     ERROR at  clause 2 of user:pl_l_/3 !!
     INSTANTIATION ERROR- =:=/2: expected bound value
之所以出现此错误,是因为
/2
希望这两个参数都接地。您可以修改谓词
pl_l_/3
以使用CLP(FD),如下所示:


职位/2是如何定义的?查询
玩家列表(X,4)的期望结果是什么。
?position/2被定义为一个数据谓词,例如position(Zlatan,Center)。所以我有大量的谓词,我想从查询中得到,例如:X=[zlatan,Rooney,Ronaldo,Messi],而不是numbers@MarwanIhab对于初学者来说,我想知道当一个新手不知道如何限定查询中的变量时,他是如何正确使用CLP(FD)的。换句话说,为什么你甚至不建议findall/3、setof/3或类似的东西?@MarwanIhab:除了Lougler指出的教程之外,我还可以推荐from和SWI Prolog手册的@Capelical:我可以理解你关于CLP(FD)的观点,这就是为什么我的文章以使用
/2
is/2
的版本开始。我的意图是指出这种做法的局限性,并随后提出一种可能的替代办法。但当然这只是一个选项。@capelical:关于
setof/3
findall/3
,我不确定从新手的角度来看,它们是否更容易理解,特别是关于后者的行为(请参阅)。我也不认为这些谓词在这个问题上会更有帮助,但也许你有一些我看不到的想法。我当然愿意接受建议:-)
   ?- player_list(X,Y).
X = [],
Y = 0 ? ;
     ERROR at  clause 2 of user:pl_l_/3 !!
     INSTANTIATION ERROR- =:=/2: expected bound value
:- use_module(library(clpfd)).

pl_l_([],0,_).
pl_l_([PL|PLs],L1,Acc0) :-
   L1 #> 0,                    % <- new
   L0 #= L1-1,                 % <- new
   position(PL,_P),
   \+ member(PL,Acc0),
   pl_l_(PLs,L0,[PL|Acc0]).
   ?- player_list([zlatan,messi,ronaldo],Y).
Y = 3

   ?- player_list(X,Y).
X = [],
Y = 0 ? ;
X = [zlatan],
Y = 1 ? ;
X = [zlatan,rooney],
Y = 2 ?
...