You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别有效体与可转换项并实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:33:20