在 Erlang 和 Haskell 中,有办法捕获整个模式匹配。例如,在 Erlang 中:
% We can capture the whole match of list, and not only inner part of structure
% like head and tail.
match_list([H|T]=F) -> hd(F).
我想知道如何在 Prolog 中做到这一点。如何在不手动重建的情况下获得整个术语:
match_list([H|T]) :-
% quite awkward, how to back-reference to it automatically?
F = [H|T], ...
我试图解决下一个任务。有很多家庭关系被指定为一组事实(类似于第 4 章 Bratko 书的一部分)。我想创建从这组家庭中返回特定家庭的谓词。目前的解决方案如下所示:
family(
person(tom, fox, date(7,may,1950), works(bbc,15200)),
person(ann, fox, date(9,may,1951), unemployed),
[
person(pat, fox, date(5,may,1973), unemployed),
person(doris, fox, date(8,may,1973), unemployed),
person(kate, fox, date(5,may,1973), unemployed),
person(jim, fox, date(6,may,1973), unemployed)]).
% ... here goes another family
foxs(F) :-
family(person(_, fox, _, _), W, CL),
family(H, W, CL),
F = family(H, W, CL).
如您所见,首先 foxs-goal 查找家庭数据库并捕获妻子(W)和孩子(CL)。在第二个子句中,它捕获了丈夫(H)。第三,重建家庭。而且我不喜欢这些东西。在 Erlang 或 Haskell 中,我可以匹配家庭并捕获它,因此不需要第二部分和第三部分。
我用谷歌搜索和stackoverflow,但没有运气。也许有人可以指出我正确的方向?
PS:我使用 SWI-Prolog。