Eni*_*gma 5 prolog sicstus-prolog
有没有办法显示所有解决方案和/或找到SICSTus序言中的解决方案?例如,下面的代码可用于解决地图着色问题。
:- use_module(library(clpfd)).
solve_AUSTRALIA(WA,NT,Q,SA,NSW,V):-
domain([WA,NT,Q,SA,NSW,V], 1, 4),%colours represented by integers from 1 to 4
WA #\= NT,
WA #\= SA,
NT #\= SA,
NT #\= Q,
SA #\= Q,
SA #\= NSW,
SA #\= V,
Q #\= NSW,
NSW #\= V,
labeling([],[WA,NT,Q,SA,NSW,V]).
Run Code Online (Sandbox Code Playgroud)
目前,我;
每次都在键入内容以查看更多解决方案,直到Prolog拒绝为止。有没有办法让我告诉Prolog一次显示所有解决方案,或者更好的是,我可以找到一些解决方案。就像序言告诉我的,有五个解决方案。
以下是计算答案数的方法。当您询问查询或执行谓词时,从Prolog中得到的就是答案。有时这些答案是解决方案,可能包含多个解决方案,无限多个解决方案,有时甚至根本没有解决方案。
最简单的方法就是说findall(t, Goal_0, Ts), length(Ts, N)
。唯一的缺点是,这需要与计算的答案数量成比例的空间。
如果您想更进一步,则需要某种计数器。当前在SICStus 4.3.3中,您可以这样进行:
:- meta_predicate count_answers(0, ?).
:- meta_predicate count_answers1(0, +, ?). % internal
:- use_module(library(types),[must_be/4]).
:- use_module(library(structs),
[new/2,
dispose/1,
get_contents/3,
put_contents/3]).
count_answers(G_0, N) :-
( nonvar(N)
-> must_be(N, integer, count_answers(G_0, N), 2)
; true
),
new(unsigned_64, Ref),
call_cleanup(count_answers1(G_0, Ref, N), dispose(Ref) ).
count_answers1(G_0, Ref, N) :-
( call(G_0),
get_contents(Ref, contents, N0),
N1 is N0+1,
put_contents(Ref, contents, N1),
fail
; get_contents(Ref, contents, N)
).
Run Code Online (Sandbox Code Playgroud)
请参见此答案,如何在其他系统中实现计数器。使用示例:
| ?- count_answers(member(_,"abcde"),Ans).
Ans = 5 ? ;
no
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
174 次 |
最近记录: |