Prolog:如何检查列表的每个成员是否都具有属性?

时间:2019-01-13 07:07:37

标签: prolog

在第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 :(得分:0)

大多数Prolog系统为此使用maplist/2 predicate [swi-doc]

因此我们可以将谓词定义为:

pipes[1]

或者我们可以通过以下方式自己实现谓词:

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

带有call/2 [swi-doc]一个ISO谓词。

答案 1 :(得分:0)

这按您想要的方式工作吗?

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.