【问题标题】:Prolog: How to use answer of one rule in next ruleProlog:如何在下一条规则中使用一条规则的答案
【发布时间】:2016-11-24 13:33:14
【问题描述】:

我正在努力弄清楚为什么这不起作用。使用 SWI-Prolog,我正在尝试:

  1. 使用 people(List) 规则根据女性 (name, eee) 事实创建女性姓名列表(称为 List)。
  2. 使用duplicate(List, Element) 规则查找由people(List) 生成的列表中的任何重复名称

人员和重复规则各自运行良好,但是当我尝试将它们组合时,程序总是返回 false,而在使用 carol 的情况下,应该返回 true。

female(carol,eee).
female(clare,eee).
female(mel,eee).
female(grace,eee).
female(clare,eee).
female(carol,eee).


%% duplicate(List, Element) is true for every matching pair of _Element_ in _List_
duplicate([First|Rest], Element) :-
    duplicate_1(Rest, First, Element).

% First occurrence
duplicate_1([This|Rest], X, X) :- % first occurrence
    duplicate_2(Rest, This, X).
duplicate_1([This|Rest], _, X) :- % look further for first occurrence
    duplicate_1(Rest, This, X).

% Second occurrence
duplicate_2(_, X, X). % second occurrence
duplicate_2([This|Rest], _, X) :- % look further for second occurrence
    duplicate_2(Rest, This, X).


people(List) :- findall(X, female(X,eee), List).

我正在尝试进入终端:

?- people(Y), duplicate(Y, carol).

任何帮助将不胜感激!

【问题讨论】:

    标签: prolog duplicates


    【解决方案1】:

    发现重复后需要停止递归调用:

    female(carol,eee).
    female(clare,eee).
    female(mel,eee).
    female(grace,eee).
    female(clare,eee).
    female(carol,eee).
    
    
    %% duplicate(List, Element) is true for every matching pair of _Element_ in _List_
    duplicate([First|Rest], Element) :-
        duplicate_1(Rest, First, Element).
    
    % First occurrence
    duplicate_1([This|Rest], X, X) :- % first occurrence
        duplicate_2(Rest, This, X), !.
    duplicate_1([This|Rest], _, X) :- % look further for first occurrence
        duplicate_1(Rest, This, X).
    
    % Second occurrence
    duplicate_2(_, X, X):-!. % second occurrence
    duplicate_2([This|Rest], _, X) :- % look further for second occurrence
        duplicate_2(Rest, This, X).
    
    
    people(List) :- findall(X, female(X,eee), List).
    

    了解 (!)cut

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多