Prolog 自动显示结果?

Prolog 自动显示结果?,prolog,backtracking,prolog-toplevel,Prolog,Backtracking,Prolog Toplevel,如何使SWI Prolog解释器自动执行分号? 由于回溯,我有很多结果(大约300个),我不想对所有结果都使用分号 我不需要所有解决方案的列表,我只想不使用分号或空格,这样我就可以让程序在后台打印回溯解决方案。您可以手动发出解决方案(例如使用write/1或format/2),并使用false强制回溯以查看所有解决方案。例如: ?-解决方案,写入,错误。 此外,例如在SWI Prolog中,只需按空格键即可,而不必按以获取进一步的解决方案。@重复一遍,不确定这是否符合您的标准,但您不能开发元解释

如何使SWI Prolog解释器自动执行分号? 由于回溯,我有很多结果(大约300个),我不想对所有结果都使用分号


我不需要所有解决方案的列表,我只想不使用分号或空格,这样我就可以让程序在后台打印回溯解决方案。

您可以手动发出解决方案(例如使用
write/1
format/2
),并使用
false
强制回溯以查看所有解决方案。例如:

?-解决方案,写入,错误。


此外,例如在SWI Prolog中,只需按空格键即可,而不必按
以获取进一步的解决方案。

@重复一遍,不确定这是否符合您的标准,但您不能开发元解释器吗?我不确定是否有办法加载mi,以便所有顶级查询都能通过它

比如:

mi1(true).
mi1((A,B)) :-
 mi1(A),
 mi1(B).
mi1(Goal) :-
 Goal \= true,
 Goal \= (_,_),
 Goal =..List,
 maplist(newvar,List,NewList),
 Goal2 =..NewList,
 clause(Goal2, Body),
 List=[_,T],!,
 findnsols(5,I,(Goal =..[_,I],Goal),T),
 mi1(Body).

newvar(V,V2):-
 var(V).
newvar(V,V):-
 nonvar(V).

%test predicates.
natnum1(0).
natnum1(s(X)) :-
 natnum1(X).

 w(w1).
 w(w2).
 w(w3).
 w(w4).
 w(w5).
 w(w6).
 w(w7).
 w(w8).
查询:

?- mi1(w(X)).
X = [w1, w2, w3, w4, w5] ;
X = [w6, w7, w8] ;
false.

?- mi1(natnum1(X)).
X = [0, s(0), s(s(0)), s(s(s(0))), s(s(s(s(0))))] ;
X = [s(s(s(s(s(0))))), s(s(s(s(s(s(0)))))), s(s(s(s(s(s(s(...))))))), s(s(s(s(s(s(...)))))), s(s(s(s(s(...)))))] ;
X = [s(s(s(s(s(s(s(s(s(...))))))))), s(s(s(s(s(s(s(s(...)))))))), s(s(s(s(s(s(s(...))))))), s(s(s(s(s(s(...)))))), s(s(s(s(s(...)))))] ;
X = [s(s(s(s(s(s(s(s(s(...))))))))), s(s(s(s(s(s(s(s(...)))))))), s(s(s(s(s(s(s(...))))))), s(s(s(s(s(s(...)))))), s(s(s(s(s(...)))))] 
...

只是展示一下基本的想法。。这只适用于1个arg谓词。

一个可能的解决方案,使用一些名称不同的Prolog系统上的讨厌的全局谓词,这里为SWI Prolog演示

chunks_of_size(Size, Goal) :-
    Size1 is Size + 1,
    nb_setval('$chunk_size', Size1),
    nb_setval('$chunk_count', Size),
    call((Goal,chunks)).

chunks :-
    nb_getval('$chunk_count', N),
    N > 0,
    M is N - 1,
    nb_setval('$chunk_count', M),
    nl,
    fail.
chunks :-
    nb_getval('$chunk_count', 0),
    nb_getval('$chunk_size', Size),
    nb_setval('$chunk_count', Size),
    write('-----'),
    chunks.
用法示例:

?- chunks_of_size(3, (between(1, 12, N), write(N))).
1
2
3
-----
4
5
6
-----
7
8
9
-----
10
11
12
-----
false.
如果要在每组解决方案之后停止用户交互,请将
chunks/0
谓词的第二个子句替换为:

chunks :-
    nb_getval('$chunk_count', 0),
    nb_getval('$chunk_size', Size),
    nb_setval('$chunk_count', Size),
    (   write('-----')
    ;   chunks
    ).
通过此更改,您现在将获得:

?- chunks_of_size(3, (between(1, 12, N), write(N))).
1
2
3
-----
N = 3 ;

4
5
6
-----
N = 6 ;

7
8
9
-----
N = 9 ;

10
11
12
-----
N = 12 ;

false.

这是另一种我认为很好的方式:

:- op(1200, xfx, all).
:- op(1200, xfx, s5).
:- op(1200, xfx, s10).

all(F,X):-
 F =.. [_|T],
 findall(T, F,X).

s5(F,X):-
 F =.. [_|T],
 findnsols(5,T,F,X).

s10(F,X):-
 F =.. [_|T],
 findnsols(10,T,F,X).

p(1).
p(2).
p(3).
p(4).
p(5).
p(6).
p(7).

nat(0).
nat(s(X)) :- nat(X).
nat_nat_sum(0,X,X).
nat_nat_sum(s(X),Y,s(Z)) :- nat_nat_sum(X,Y,Z).
问:


优点是,您只需在查询结束时添加所需的答案数量。然后,您将获得该长度的列表作为答案,这样它们不仅会写入控制台,而且还可以用于进一步的查询

我相信您的prolog解释器的prolog手册在“解决方案提示”中描述了您的各种选项。它没有重复。我不想列出解决方案。我只想要一个自动分号。在这种情况下,使用ISO Prolog内置的控件构造
fail/0
会更清楚一些(尽管ISO最近也对
false/0
进行了标准化)。我不确定如何实现这一点。这就是我得到的
agrupacion_compatible_de_asignaturas(C,P):-findall(A,lista_de_clase(C,A,U),J),setof(T,(subseq0(J,T),not(T=[]),not(grupo_compatible(T)),Y,subseq0(Y,P),flatte(P,U),is_集(U),置换(U,J)。
我现在得到了它。这不是一个理想的解决方案,但它很好地解决了这个问题。@Javier:习惯上,一定要用
writeq/1
写出一般的序言术语。不要使用write或writeln。他们把一些术语弄得乱七八糟。@Javier:总是在必须引用的时候。想想看,
T='ab'
在swi prolog中必须有一个设置,就像在swish中一样,你可以巧妙地完成接下来的10个解决方案等等!我希望有些人已经准备好了所需的一切,所以我只需要设置正确的标志。swish也有类似的功能(但我需要将默认行为更改为“无论何时运行查询,都会搜索并显示至少5-10个答案”)。当然,古普至少做了20年正确的事情……如果是为了?-纳特纳姆(X)。X被绑定到[0,s(0),s(s(0)),s(s(0)),s(s(s(s(0)))])],那么您希望对诸如natnum(X),natnum(Y),something(X,Y,Z)之类的查询执行什么操作呢?在大多数Prolog系统中,标准的
子句/2
谓词只能与动态谓词…s(X)一起使用。将恶习转化为向善的力量无疑是一件“好事”™"!使用
nb_setarg
是否可以摆脱“全局变量”的味道?重复一下。但它仍然会发出臭味:-)
 ?- nat(X),nat(Y),nat_nat_sum(X,Y,Z) s5 Sols.
 Sols = [[nat(0),  (nat(0), nat_nat_sum(0, 0, 0))], [nat(0),  (nat(s(0)), nat_nat_sum(0, s(0), s(0)))], [nat(0),  (nat(s(s(0))), nat_nat_sum(0, s(s(0)), s(s(0))))], [nat(0),  (nat(s(s(...))), nat_nat_sum(0, s(s(...)), s(s(...))))], [nat(0),  (nat(s(...)), nat_nat_sum(0, s(...), s(...)))]] ;
 Sols = [[nat(0),  (nat(s(s(s(s(s(...)))))), nat_nat_sum(0, s(s(s(s(s(...))))), s(s(s(s(s(...)))))))], [nat(0),  (nat(s(s(s(s(...))))), nat_nat_sum(0, s(s(s(s(...)))), s(s(s(s(...))))))], [nat(0),  (nat(s(s(s(...)))), nat_nat_sum(0, s(s(s(...))), s(s(s(...)))))], [nat(0),  (nat(s(s(...))), nat_nat_sum(0, s(s(...)), s(s(...))))], [nat(0),  (nat(s(...)), nat_nat_sum(0, s(...), s(...)))]] ;
Sols = [[nat(0),  (nat(s(s(s(s(s(...)))))), nat_nat_sum(0, s(s(s(s(s(...))))), s(s(s(s(s(...)))))))], [nat(0),  (nat(s(s(s(s(...))))), nat_nat_sum(0, s(s(s(s(...)))), s(s(s(s(...))))))], [nat(0),  (nat(s(s(s(...)))), nat_nat_sum(0, s(s(s(...))), s(s(s(...)))))], [nat(0),  (nat(s(s(...))), nat_nat_sum(0, s(s(...)), s(s(...))))], [nat(0),  (nat(s(...)), nat_nat_sum(0, s(...), s(...)))]] .

 ?- p(X) s5 Sols.
 Sols = [[1], [2], [3], [4], [5]] ;
 Sols = [[6], [7]].