簡體   English   中英

序言統一兩個列表

[英]Prolog unifying two lists

好吧,所以我試圖統一這兩個列表: [2][1,_,3]給出[1,2,3]的答案。 我的代碼如下:

unify([],[],_).
unify(List1, [Head|Rest], List2) :- member(List1,Head),!,
                                         unify([X|_], Rest, [X|List2]).
unify(List1, [Head|Rest], [Head|List2]) :- unify(List1, Rest, List2).

當我放?-unify([2],[1,_,3],L)它為false,但我希望它為L=[1,2,3] 如何改善上述代碼?

我也嘗試過跟蹤,但是我不知道。

[debug] 5 ?- unify([2],[1,_,3],L).
T Call: (6) unify([2], [1, _G512, 3], _G520)
T Redo: (6) unify([2], [1, _G512, 3], _G520)
T Call: (7) unify([2], [_G512, 3], _G602)
T Call: (8) unify([_G607|_G608], [3], [_G607|_G602])
T Redo: (8) unify([_G607|_G608], [3], [_G607|_G602])
T Call: (9) unify([3|_G608], [], _G602)
T Fail: (9) unify([3|_G608], [], _G602)
T Fail: (8) unify([_G607|_G608], [3], [_G607|_G602])
T Fail: (7) unify([2], [_G512, 3], _G602)
T Fail: (6) unify([2], [1, _G512, 3], _G520)
false

首先,您需要修正基本情況:而不是使用

unify([],[],_).

這表示左側的空白列表需要中間的空白列表,並產生不確定的結果,請使用以下兩個:

unify(_,[],[]).
unify([],L,L).

第一個基本子句說,如果第二個列表為空,則無論第一個列表中的內容如何,​​輸出也為空。

第二個基本子句說,當第一個列表為空時,輸出與第二個列表相同。

現在,我們需要構建兩個減少該問題的子句:

unify([H|T1], [H|T2], [H|R]) :- unify(T1, T2, R).
unify([H1|T1], [H2|T2], [H2|R]) :- H1 \= H2, unify([H1|T1], T2, R).

第一條說,如果兩個列表的標題是統一的,則當兩個列表都減少時,將統一的標題附加到已減少問題的輸出上。

第二個子句說,如果首部不統一,那么當只精簡第二個列表時,將第二個列表的首部附加到簡化問題的輸出上。

這是有關ideone演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM