我已经陷入了几个小时,已经试图完全删除我的逻辑或/3谓词的选择点,这些选择点与两个逻辑变量相关联,并将其与第三个相关联,而第三个可以是true,false或'u'(未知)。

问题描述 投票:0回答:1

?- or(A,false,C). A = C, C = true ; A = C, C = u ; false.

我尝试使用IF_/3和REIF软件包,但我总是在某个地方选择一个选择点。这是我设法进行的迭代之一,但最终仍然有一个无用的选择点:

or3(A, B, C) :- if_( C = u , if_( A = u , ( B = u ; B = false) , ( A = false, B = u ) ), if_( C = true , if_( A = true , ( B = true ; B = false) , ( A = false, B = true ) ) , false ) ). ?- or3(A,false,C). Correct to: "tri_logic:or3(A,false,C)"? yes A = C, C = u ; A = C, C = true ; false.
i还直接使用=/3和;/3尝试实现仅适用于真实值的版本,但结果甚至几乎相同:

or3(A,B,C) :- =( C, true, T), ;( ( A = true, B = true ), ( A = true, B = false ), T1 ), ;( T1=true, ( A = false, B = true), T). ?- or3(A,false,C). Correct to: "tri_logic:or3(A,false,C)"? yes A = C, C = u ; A = C, C = true ; false.
我觉得我在这里错过了一些东西。任何帮助都非常感谢!

为了防止不必要的选择点,必须将这两个参数视为simultanate

。而

if_
考虑一个值。
可以使用Prolog的关系方面 - 列出可能性:

% Using table to improve determinism :- table and_or/4. % Bool (or u), Bool (or u), AND, OR and_or(true, true, true, true). and_or(false, true, false, true). and_or(u, true, u, true). and_or(true, false, false, true). and_or(false, false, false, false). and_or(u, false, false, u). and_or(true, u, u, true). and_or(false, u, false, u). and_or(u, u, u, u).
prolog swi-prolog reify
1个回答
0
投票
表指令在此使用,以防止不必要的选择点来索引

and_or查找。 ,这只是执行查找的一种情况:

andt(A, B, T) :-
    and_or(A, B, T, _).
    
ort(A, B, T) :-
    and_or(A, B, _, T).

示例:

?- andt(true, u, T).
T = u.  % No unwanted choicepoint

?- ort(true, u, T).
T = true.  % No unwanted choicepoint

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.