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 ?
...