Prolog:如何捕获术语或模式匹配的整个结果

标签 prolog pattern-matching

在 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], ...

我已经尝试解决下一个任务。有很多家庭关系被指定为一组事实(类似于布拉特科书第四章的一部分)。我想创建从这组家庭中返回特定家庭的谓词。目前的解决方案如下所示:

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).

正如你所看到的,首先狐狸的目标是查找家庭数据库并捕获妻子(W)和 child (CL)。在第二个子句中,它捕获了丈夫(H)。第三,重建家庭。我不喜欢这些东西。在 Erlang 或 Haskell 中,我可以匹配 family 并捕获它,因此不需要第二部分和第三部分。

我用谷歌搜索和 stackoverflowed,但没有运气。也许有人可以指出我正确的方向?

PS:我使用SWI-Prolog。

最佳答案

更短的模式可能是

foxs(F) :-
  F = family(person(_, fox, _, _), person(_, fox, _, _), _),
  call(F).  % was F.

关于Prolog:如何捕获术语或模式匹配的整个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18696125/

相关文章:

lambda - 计算两个向量的点积

prolog - :- and ? - 在 Prolog 中有什么区别?

prolog - 关于序言如何工作的误解

函数返回与函数参数中的 Haskell 模式匹配

list - 在 Prolog 中查找列表中列表的长度

序言+clpfd : simple binary number parser with value

regex - 如何使用正则表达式匹配字符串中的前一个字符

f# - 测试序列中所有项目是否相同的表达式

pattern-matching - 如何匹配具有多个字段的选项?

java - 使用 java matcher 类时出现非法状态异常