如何在Prolog中打印dynamic/1下内容 单条查询输出所有男性名称
Prolog打印dynamic谓词存储内容的方法
首先假设你已经提前声明了对应dynamic谓词,示例中存储男性名称的谓词声明为:
:- dynamic male/1. % 已提前存入示例数据 assertz(male(张三)). assertz(male(李四)). assertz(male(王五)).
方法1:直接使用内置listing/1打印所有子句
这是最简单的方式,直接输出对应dynamic谓词的所有事实定义:
% 打印male/1的所有存储内容 listing(male/1).
输出示例:
male(张三). male(李四). male(王五).
方法2:遍历打印仅名称内容
如果不需要输出谓词名,只需要打印存储的名称值,可以用forall/2遍历匹配所有结果逐个输出:
forall(male(Name), (write(Name), nl)).
输出示例:
张三 李四 王五
方法3:收集为列表统一打印
如果需要先把所有名称收集到列表中再统一输出,可以用findall/3实现:
findall(Name, male(Name), MaleList), write(MaleList).
输出示例:
[张三, 李四, 王五]
通用方法:打印任意dynamic谓词的内容
如果你需要一个通用的查询语句,支持传入任意dynamic谓词名和元数打印所有内容,可以定义如下通用谓词:
print_dynamic(PredName, Arity) :- functor(Term, PredName, Arity), forall(clause(Term, true), (write(Term), nl)).
调用示例(打印male/1的所有内容):
print_dynamic(male, 1).
内容的提问来源于stack exchange,提问作者Saad Salman
相关产品推荐
相关产品推荐

