我正在尝试理解序言的语言(使用程序Visual Prolog 5.1/5.2)
有一个任务 - 实现游戏“公牛和奶牛”(或杰出的头脑)。
玩家制作一个数字(由 0 到 9 的数字组成,不重复),例如 1458,然后输入到程序中。计算机试图猜测这个数字,提出假设。然后他问玩家有多少“公牛”(精确匹配),有多少“牛”(匹配的数字不在正确的位置)。我写了一个程序来做到这一点。有用。
现在我要计算机计算公牛和奶牛的数量。怎么做才对?
这是一个有两个列表的作品。
DOMAINS
list = integer*
list1 - 密钥(隐藏数字),list2 - 假设(计算机)
我试图为多头计数编写谓词,但程序产生“无解”(可能是因为以下原因(转换))
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).
我也通过 读取了数字readint(_Key)
,但_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,
!.
谢谢你!
/ -------------------------------------------------- ---------------------------------------- /
新添加(从键盘读取列表,输入字符时停止):
domains
list=integer*
predicates
readlist(list)
clauses
readlist([H|T]):-
write("> "),
readint(H),!,
readlist(T).
readlist([ ]).