Пролог: Как проверить, есть ли у каждого члена списка свойство? - PullRequest
0 голосов
/ 13 января 2019

В книге «Пролог на примере: как учить, учить и использовать» на странице 32:

Проверьте, удовлетворяют ли все элементы списка некоторому свойству (то есть унарному предикату).

Логическая программа:

satisfy_property([], _). satisfy_property([X|L], P) :- R=..[P,X],R, satisfy_property(L,P).

beautiful(mary). 
beautiful(anne). 
beautiful(louise).

Исполнение:

?-satisfy_property([mary, anne, louise], beautiful). 
Yes

Помогите изменить логику программы: как я могу проверить каждого члена списка?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Это работает так, как вы хотите?

satisfy_property([], _).
satisfy_property([X|L], P) :-
    var(X),
    !,
    write("false "),
    satisfy_property(L,P).
satisfy_property([X|L], P) :-
    R=..[P,X],
    R,
    write("true "),
    satisfy_property(L,P).
satisfy_property([X|L], P) :-
    R=..[P,X],
    not(R),
    write("false "),
    satisfy_property(L,P).

beautiful(mary). 
beautiful(anne). 
beautiful(louise).

?-satisfy_property([mary, tom, TOM, anne, louise], beautiful). 

Это дает мне:

true false false true true Yes.
0 голосов
/ 13 января 2019

Большинство систем Prolog для этого имеют предикат maplist/2 [swi-doc] .

Таким образом, мы можем определить предикат как:

satisfy_property(L, P) :-
    maplist(P, L).

или мы можем реализовать предикат самостоятельно:

satisfy_property([], _).
satisfy_property([H|T], P) :-
    call(P, H),
    satisfy_property(T, P).

с call/2 [swi-doc] предикат ISO.

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