Prolog逻辑谜题

时间:2016-05-23 22:27:44

标签: prolog logic

我有下一个问题:有四个列表。第一个列表包含一个或多个表的代码。第二个列表包含数字,表示每个表上的苹果数。第三个列表包含一个或多个子名称,第四个列表包含每个孩子将接收多少个苹果。

例如:[a],[3],[c,d],[2,1]; a是表格的代码,3是其上的苹果数量。 cd是孩子的名字,而21分别是c收到的d个。

找出每个孩子从任何桌子上接收苹果的可能方式。

对于示例1,我给出了唯一可能的解决方案:子c将从a获取两个苹果,而子d将获得一个。 输出应该是这样的:[[a,c,2],[a,d,1]]

桌子和儿童的数量没有限制,桌子上总会有儿童需要的苹果数量。

我知道我必须提供一些代码,但我真的不知道如何开始。关于如何开始的一些提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,尝试提供单个请求。可以像

一样简单
update([K|Ks],[V|Vs],N,[U|Us],[take(T,K)|TKs]) :-
    N > 0,
    T is min(N,V),
    M is N-T,
    U is V-T,
    update(Ks, Vs, M, Us, TKs).
/*update([_|Ks],[_|Vs],N,Us,TKs) :-
    N > 0,
    update(Ks, Vs, N, Us, TKs).*/
update(_,Vs,N,Vs,[]) :-
    N =< 0.

也就是说,在请求N个苹果的情况下,尽可能从表K中取出U个苹果。

取消注释2 ^子句会回答一个稍微不同的问题:而不是Find out a possible way...会显示Find out all possible ways...

然后尝试适用于所有孩子......