proceed(N, [H|T], [Output]) :-
N > 0, NewN is N - 1, NewH is H - 1,
proceed(NewN, T, [NewH|Output]).
概念是它将获å–列表并将å‰Nä¸ªå…ƒç´ å‡1,并将结果列表分é…ç»™å˜é‡Output。例如。当我写查询时:
?-proceed(2, [3,2,1], Answer)
我希望它“返回â€ï¼š
Answer = [2,1,1].
æˆ‘æ€Žæ ·æ‰èƒ½åšåˆ°è¿™ä¸€ç‚¹ï¼Ÿæˆ‘知é“我需è¦ä¸€äº›åœæ¢è°“è¯ï¼Œä½†æƒ³ä¸åˆ°ä¸€ä¸ªã€‚ 如果有人能æ供一个好的解释ç”案,我将ä¸èƒœæ„Ÿæ¿€ã€‚
ç”案 0 :(得分:0)
您当å‰çš„代ç å˜åœ¨ä¸¤ä¸ªé—®é¢˜ï¼š
现在让我们é€ä¸€è€ƒè™‘这两点。简而言之,您的基本åå¥åº”æ述在ä¸éœ€è¦è¿›ä¸€æ¥å¤„ç†æ—¶ä¼šå‘生什么。如果å‘生这ç§æƒ…况å–决于手头的问题:基本åå¥å¯ä»¥æ述当输入列表为空,一个或多个å‚数达到特定状æ€æˆ–其他类似情况时会å‘生什么。
在您的情况下,基本åå¥éœ€è¦æè¿°N
å˜ä¸ºé›¶æ—¶ä¼šå‘生什么。ç”案很简å•ï¼šå½“N
为零时,输入列表将被å¤åˆ¶åˆ°è¾“出ä¸è€Œä¸è¿›è¡Œæ›´æ”¹ã€‚å› æ¤ï¼Œæ‚¨çš„基本åå¥æ˜¯
proceed(0, L, L).
在N
达到零之å‰ï¼Œå½“åˆ—è¡¨ç”¨å®Œå…ƒç´ æ—¶ï¼Œæ‚¨è¿˜éœ€è¦å¤„ç†è¿™ç§æƒ…况:
proceed(_, [], []).
è¿™ä¹Ÿå¾ˆç®€å• - å¦‚æžœè¾“å…¥åˆ—è¡¨ä¸ºç©ºï¼Œåˆ™è¾“å‡ºä¹Ÿåº”ä¸ºç©ºï¼Œæ— è®ºN
的值是什么。
çŽ°åœ¨è®©æˆ‘ä»¬å›žåˆ°ä½ çš„ä¸»è¦æ¡æ¬¾ã€‚您的代ç æ£ç¡®è®¡ç®—N
å’Œheadå…ƒç´ çš„ä¸‹ä¸€ä¸ªå€¼ï¼Œä½†ä¸æ˜¯å°†å®ƒä»¬ç²˜è´´åˆ°è¾“出ä¸ï¼Œè€Œæ˜¯å°†å®ƒä»¬æ”¾å…¥é€’归调用ä¸ã€‚这是更æ£åŽçš„版本:
proceed(N, [H|T], [NewH|Output]) :-
N > 0,
NewN is N - 1,
NewH is H - 1,
proceed(NewN, T, Output).
现在NewH
è¢«æ·»åŠ å›žåå¥æ ‡é¢˜ä¸çš„Output
,确ä¿è¾“出“回æµâ€åˆ°è°ƒç”¨è€…。这å¯èƒ½çœ‹ä¼¼è¿å直觉,但这就是Prolog的工作原ç†ã€‚
这是demo on ideone。