如何识别有效体与可转换项并实现ISO Prolog对应谓词
实现符合ISO标准的
is_convertible_term/1与is_body/1谓词 一、is_convertible_term/1的实现
规则说明
根据ISO/IEC 13211-1第7.6.2节规定,当项T可转换为有效体时,谓词
is_convertible_term(T)应返回true。
示例
?- is_convertible_term((A,B)). true. ?- is_convertible_term(A). true. ?- is_convertible_term(3.14). false. ?- is_convertible_term((a->b;c,!)). true. ?- is_convertible_term(\+1). true. % 因为 (\+)/1 是内置谓词
实现代码
is_convertible_term(T) :- var(T), !. is_convertible_term((A,B)) :- !, is_convertible_term(A), is_convertible_term(B). is_convertible_term((A->B)) :- !, is_convertible_term(A), is_convertible_term(B). is_convertible_term((A;B)) :- !, is_convertible_term(A), is_convertible_term(B). is_convertible_term(!) :- !. is_convertible_term(\+ A) :- !, is_convertible_term(A). is_convertible_term(T) :- compound(T), functor(T,F,A), current_predicate(F/A), !. is_convertible_term(_) :- false.
代码说明
- 变量直接判定为可转换
- 递归处理控制结构(
,/2、->/2、;/2、!/0、\+/1),要求子项均可转换 - 复合项需匹配内置谓词的函子与元数(通过
current_predicate/1判断) - 原子、数字等其他项判定为不可转换
二、is_body/1的实现
规则说明
当项T与转换后的有效体完全相同时,谓词
is_body(T)应返回true,可用于移除call包装器(需避免与!/0或顶层(->)/2冲突)。
示例
?- is_body((a,X)). false. ?- is_body((a,call(X))). % 这是 (a,X) 的转换结果 true.
补全后的实现代码
is_body(T) :- is_convertible_term(T), convert_term_to_body(T, T). convert_term_to_body(T, call(T)) :- var(T), !. convert_term_to_body((A,B), (A',B')) :- !, convert_term_to_body(A,A'), convert_term_to_body(B,B'). convert_term_to_body((A->B), (A'->B')) :- !, convert_term_to_body(A,A'), convert_term_to_body(B,B'). convert_term_to_body((A;B), (A';B')) :- !, convert_term_to_body(A,A'), convert_term_to_body(B,B'). convert_term_to_body(!, !) :- !. convert_term_to_body(\+A, \+A') :- !, convert_term_to_body(A,A'). convert_term_to_body(T, T) :- compound(T), functor(T,F,A), current_predicate(F/A), !.
代码说明
is_body/1依赖is_convertible_term/1确保项可转换为有效体convert_term_to_body/2实现项到有效体的转换逻辑,当转换前后项完全相同时,说明T本身就是规范的有效体,is_body/1返回true- 变量会被转换为
call(Var),因此变量本身不是有效体;控制结构需递归确保子项已是规范形式;内置谓词的复合项本身就是有效体
注:仅考虑无约束扩展的ISO Prolog,可使用Prolog序言中的谓词。
内容的提问来源于stack exchange,提问作者false
相关产品推荐
相关产品推荐

