多个'\ ='[Prolog]

rot*_*171 0 prolog

我怎样才能更简洁地表达以下结合?

condition(X1, X2, X3, X4, X5) :- 
    X1 \= X2, 
    X1 \= X3, 
    X1 \= X4, 
    X1 \= X5, 
    X2 \= X3, 
    X2 \= X4, 
    X2 \= X5, 
    X3 \= X4, 
    X3 \= X5, 
    X4 \= X5.
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想使用内置/库谓词的单个目标.

rep*_*eat 5

这取决于...

如果所有Xi都是整数并且您的Prolog支持有限域约束(),那么只需写:

:- use_module(library(clpfd)).

condition(X1, X2, X3, X4, X5) :- 
   all_distinct([X1,X2,X3,X4,X5]).        % use library predicate


tas*_*tas 5

如果列表由唯一元素组成,您还可以选择使用maplist/2定义谓词唯一/ 1.然后你的谓词条件/ 5将作为调用谓词:

:- use_module(library(apply)).        % for maplist/2

condition(X1, X2, X3, X4, X5) :-
   uniques([X1,X2,X3,X4,X5]).

uniques([]).
uniques([X|Xs]) :-
   maplist(dif(X),Xs),
   uniques(Xs).

?- condition(1,2,3,4,5).
true.

?- condition(1,2,3,4,1).
false.
Run Code Online (Sandbox Code Playgroud)

uniques/1可用于任意列表:

?- uniques([]).
true.

?- uniques([1,a,6,f(X)]).
true.

?- uniques([A,B,C]).
dif(A, C),
dif(A, B),
dif(B, C).

?- uniques([A,B,A]).
false.

?- uniques(U).
U = [] ;
U = [_G265] ;
U = [_G392, _G395],
dif(_G392, _G395) ;
U = [_G489, _G492, _G495],
dif(_G489, _G495),
dif(_G489, _G492),
dif(_G492, _G495) ;
.
.
.
Run Code Online (Sandbox Code Playgroud)

  • 有一个错误:条件(1,2,3,3,4)给出了真实. (2认同)