семейные отношения в прологе: потомок дерева - PullRequest
0 голосов
/ 13 октября 2018

Я хочу рекурсивно хранить семейные отношения в структуре списка.У меня есть следующий код:

descendantTree(X,[X]) :-
    \+ parent(X,_).

descendantTree(X,L) :-
    forall(parent(X,Y), descendantTree(Y,YL)),
    append([X],[YL],L).

parent(john, paul).
parent(john, mary).
parent(paul, henry).
parent(paul, june).
parent(mary, adam).
parent(henry, helen).

То, что я ожидал, выглядит так:

L =[john,[paul,[henry,[helen]],[june]],[mary,[adam]]]

Но на самом деле он просто возвращает:

L = [john, _9250].

Не могли бы вы сказать мне, почему

1 Ответ

0 голосов
/ 13 октября 2018

Предикат forall/2 реализует цикл генерации и тестирования с использованием отрицания.Его можно определить следующим образом:

% for all solutions of Generate, Test is true
forall(Generate, Test) :-
    \+ (Generate, \+ Test)).

Использование отрицания означает, что при успешном вызове привязки не возвращаются.В вашем случае это означает, что вы звоните:

append([X],[_],L)

отсюда и результат, который вы получите:

L = [john, _9250].

Взгляните вместо этого на семейство all-solutions предикатов: bagof/3, setof/3 и findall/3, а затем рассмотрите возможность редактирования вашего вопроса с учетом полученных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...