【问题标题】:Swi-prolog breaks on order check订单检查时 Swi-prolog 中断
【发布时间】:2026-01-06 23:30:01
【问题描述】:

我在 Prolog 上有以下代码

concat([], [], []).
concat([], [H|T], [H|T2]) :- concat([], T, T2).
concat([H|T], L2, [H|T2]) :- concat(T, L2, T2).

is_ordered([]).
is_ordered([_X]).
is_ordered([X,Y|Tail]) :- X =< Y, is_ordered([Y|Tail]).

我尝试获取适合concatis_orderedX 示例。

当我输入时

concat([1, 2, 3], [4, 4, 4], X)

我得到了结果,但是当我尝试对 is_ordered 做同样的事情时

is_ordered(X)

简单示例[][_1784]后出现错误

{
  "code":500,
  "message":"Unknown error term: assertion_error(fail,pengines:event_term_to_json_data(error('583c29ce-fa49-4b06-971f-1c928260dcac',error(instantiation_error,context(prolog_stack([frame(2,call(system:(=<)/2),_714=<_716),frame(1,pred_line(\"is_ordered/1\",'pengine://583c29ce-fa49-4b06-971f-1c928260dcac/src':31),is_ordered([_756,_762]))]),_676))),_656,'json-html'))"
}

为什么会发生这种情况?

【问题讨论】:

  • 有用生成器的规则是什么?例如。 1 约束?

标签: prolog


【解决方案1】:

问题是is_ordered/1 没有构造函数,你不能用一个不统一的变量来运行它。示例:

?- concat([1, 2, 3], [4, 4, 4], X).
X = [1, 2, 3, 4, 4, 4]; 
false.

?- concat([1, 2, 3], [4, 4, 4], X), is_ordered(X).
X = [1, 2, 3, 4, 4, 4];
false.

?- is_ordered(X).
X = [];
X = [_1376];

{
  "code":500,
  "message":"Unknown error term: assertion_error(fail,pengines:event_term_to_json_data(error('05d667b4-a0b8-415b-bee8-459a753f19b3',error(instantiation_error,context(prolog_stack([frame(2,call(system:(=<)/2),_694=<_696),frame(1,pred_line(\"is_ordered/1\",'pengine://05d667b4-a0b8-415b-bee8-459a753f19b3/src':6),is_ordered([_736,_742|_744]))]),_656))),_636,'json-html'))"
}

?- is_ordered([1, 2, 3, 4, 4, 4]).
true;
false.

第一个示例生成您的串联列表X。第二个查询另外运行您要应用的测试。另一方面,第三个查询没有关于变量内容的信息,并试图取消它,并且在尝试应用第三个规则时会失败。用 SWISH 测试。

所以解决方案是运行第二个查询而不是第三个。

【讨论】: