我正在尝试理解序言的语言(使用程序 Visual Prolog 5.1 / 5.2 )
有一项任务-实现游戏 “牛与牛” (或杰出的思想)。
播放器生成一个数字(由0到9组成,无重复),例如1458,并将其输入程序。 计算机尝试猜测这个数字,并提出一些假设。然后,他询问玩家多少个“子弹”(完全匹配)和多少个“牛”(匹配的数字不在正确的位置)。 我写了一个程序来做到这一点。可以。
现在,我希望计算机计算多头和多头牛的数量。怎么做对呢?
这是一个有两个列表的作品。
GPS tester
列表1-密钥(隐藏编号),列表2-假设(计算机)
我试图写一个用于多头计数的谓词,但是该程序产生“无解”(可能是由于以下原因( converting ))
DOMAINS
list = integer*
我也通过comparison(_Key, Assemption, Bulls /*, Cows*/):-
find_bulls(_Key, Assemption, Bulls),
%find_cows(_Key, Assemption, Cows).
find_bulls(Key, Assemption, Bulls):-
find_bulls(Key, Assemption, Bulls, 0).
find_bulls([],[], Bulls, Amount):- Bulls=Amount,!.
find_bulls([A1|L1],[A2|L2], Bull, Amount):-
A1 = A2,
Am = Amount + 1,
find_bulls(L1, L2, Bull, Am).
读取了数字,但是 _Key 不是列表,对吗? 如何将整数转换为列表以提供谓词?
readint(_Key)
谢谢!
/ ------------------------------------------- ---------------------------------- /
新添加(从键盘读取列表,在输入字符时停止):
question(Assemption,_Key):-
assemption(Assemption),
not(contradictory(Assemption)),
%------------------------------------------------------------
comparaison(_Key,Assemption, Bulls /*,Cows*/),
%------------------------------------------------------------
write(" My assemption: ", Assemption), nl,
write("How much bulls? -----> ", Bulls), nl, %readint(Bulls),
write("How much cows? -----> "), /*Cows)*/ readint(Cows), nl,
Bulls + Cows <= size,
assert(request(Assemption, Bulls, Cows)),
Bulls = size,
!.
答案 0 :(得分:0)
[已解决]
find_bull_and_cows(OldAssemption,Assemption,Bulls,Cows):-
exact_match(OldAssemption,Assemption,Bulls),
common_numbers(OldAssemption,Assemption,N2),
Cows= N2 - Bulls.
%bulls finding
exact_match(X,Y,N):- exact_match(X,Y,0,N).
exact_match([Digit|OldPin],[Digit|NewPin],K,N):- !,
K1=K+1,
exact_match(OldPin,NewPin,K1,N).
exact_match([_|OldPin],[_|NewPin],K,N):- exact_match(OldPin,NewPin,K,N).
exact_match([],[],N,N).
%cows finding
common_numbers(X,Y,N):- common_numbers(X,Y,0,N).
common_numbers([Digit|OldPin],NewPin,K,N):-
member(Digit,NewPin), !,
K1=K+1,
common_numbers(OldPin,NewPin,K1,N).
common_numbers([_|OldPin],NewPin,K,N):- common_numbers(OldPin,NewPin,K,N).
common_numbers([],_,N,N).
%member of list
member(A,[A|_]):- !.
member(A,[_|L]):- member(A,L).