繁体   English   中英

prolog的独特结果

[英]unique results from prolog

是否有一种简单的方法在prolog中进行查询只返回一次结果?

例如我正在尝试这样的事情:

deadly(Xn) :- scary(X), Xn is X - 1, Xp is X + 1, not(safe(Xn)), safe(Xp).
deadly(Xp) :- scary(X), Xn is X - 1, Xp is X + 1, not(safe(Xp)), safe(Xn).

deadly(X).

并得到

X = 5

X = 5

X = 5

X = 5

....

不是对我有用。

您可以做的一件事是将setof/3应用于生成解决方案的谓词。 但请注意, setof/3是通过sort/2 bagof/3传递的结果应用sort/2来实现的(至少在SWI-Prolog中是这种情况)。 因此,如果您的解决方案生成器永远存在,那么将永远不会应用setof/3 ...

所以我想说尝试编程,以便不生成重复项,即通过使用切割(!)它是有意义的。

如果我没记错的话,有一个谓词解决方案(或类似的,自从我编写Prolog以来已经有一段时间了),它在列表中收集了独特的解决方案。

编辑: setof/3是我想到的那个。 谢谢,卡雷尔。

另一种方法是记住解决方案。

:- dynamic seen/1.

% Call this always before calling deadly_wrapper/1
clear_seen :-
    retractall(seen(_)).

% This wrapper calls deadly/1 but remembers
% the solution using assert/1, and fails
% if the solution has been "seen" before.
deadly_wrapper(X) :-
    deadly(X),
    (
        seen(X)
    ->  
        fail
    ;
        assert(seen(X))
    ).  


% This is for testing.
deadly(1).
deadly(1).
deadly(1).
deadly(5).
deadly(1).
deadly(1).

如果你的Prolog支持tabling,那么它会变得更简单。 示例文件:

:- table deadly/1.

deadly(1).
deadly(1).
deadly(5).
deadly(1).
deadly(5).

使用XSB执行示例:

$ xsb
[xsb_configuration loaded]
[sysinitrc loaded]

XSB Version 3.2 (Kopi Lewak) of March 15, 2009
[x86_64-unknown-linux-gnu; mode: optimal; engine: slg-wam;
 scheduling: local; word size: 64]

| ?- [deadly_tab].
[Compiling ./deadly_tab]
[deadly_tab compiled, cpu time used: 0.0100 seconds]
[deadly_tab loaded]

yes
| ?- deadly(X).

X = 5;

X = 1;

no
| ?- 

没有更多的代码很难说,但你可能正在寻找切割运算符( ! )。 如果你想发布foo定义 ,我(或其他人)可以提供详细/具体的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM