我對 Prolog 很陌生,想知道是否可以幫助我更好地理解下面的代碼。我理解與“divides”和“find_num”相關的代碼,但我很難理解“check_list”正在發生的事情。任何有助于加深我的理解的幫助將不勝感激。
divides(X, Y) :-
X mod Y =:= 0.
find_num(X, Y, Lout) :-
findall(N, between(1, X, N), Lin),
check_list(Lin, Y, Lout).
check_list([], _, []).
check_list([H | Tin], Y, [H | Tout]) :-
divides(H, Y),
check_list(Tin, Y, Tout).
check_list([H | Tin], Y, Lout) :-
\ divides(H, Y),
check_list(Tin, Y, Lout).
uj5u.com熱心網友回復:
讓我們看一個更簡單的謂詞:
copy_list([],[]).
copy_list([H|Tin],[H|Tout]) :- copy_list(Tin,Tout).
如果您傳入兩個相同的串列,則如果它們相等,則此謂詞將成功。如果您傳遞一個串列和一個變數,無論哪種方式,這都會復制串列。
習慣上把輸入放在左邊,輸出放在右邊。
讓我們看看這個查詢:
?- copy_list([1,2,3],Xs).
Xs在內部 Prolog(在我的例子中是 SWI)用內部名稱替換變數,所以第一個呼叫是copy_list([1, 2, 3], _52812). Prolog 查找謂詞匹配并找到copy_list([H|Tin],[H|Tout]). 然后統一得到copy_list([1|2,3],[1|_55684]). 然后它試圖證明身體。
它的第二個呼叫是copy_list([2,3],_55684). Prolog 查找謂詞匹配并找到copy_list([H|Tin],[H|Tout]). 然后統一得到copy_list([2|3],[2|_69116]). 然后它試圖證明身體。
它的第三個呼叫是copy_list([3],_69116). Prolog 查找謂詞匹配并找到copy_list([H|Tin],[H|Tout]). 然后統一得到copy_list([3|[]],[3|_69734]). 然后它試圖證明身體。
在第四次呼叫時,空串列謂詞copy_list([],[]).現在匹配。所以它開始展開遞回。_69734它與空串列統一。_69116它與[3],然后_55684與[2,3],最后_52812與和它統一,[1,2,3]它宣布成功。節目是真的。
簡而言之,它這樣做:
copy_list([1, 2, 3], _52812)
copy_list([2, 3], _55684)
copy_list([3], _69116)
copy_list([], _69734)
copy_list([], [])
copy_list([3], [3])
copy_list([2, 3], [2, 3])
copy_list([1, 2, 3], [1, 2, 3])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/486360.html
上一篇:從深度未知的嵌套陣列中洗掉專案
