Prolog-计算两个列表中的匹配项

时间:2018-12-24 08:03:58

标签: list prolog digits visual-prolog

我正在尝试理解序言的语言(使用程序 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,
    !.

1 个答案:

答案 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).