【问题标题】:SWI-Prolog check if two elements in different lists are not at a same position. element 1 should be before or after element positionSWI-Prolog 检查不同列表中的两个元素是否不在同一位置。元素 1 应该在元素位置之前或之后
【发布时间】:2020-09-29 22:20:21
【问题描述】:

我需要编写一个谓词 bapos(L1,L2,E1,E2),当 L1 和 L2 是列表时为真,这样 E1 在 L1 中的位置是 E2 在 L2 中的位置之前或之后的一个位置。

我的解决方案:

bapos([_|_],[L2|_], _, L2).
bapos([_|L1],[_|L2],E1,E2) :- bapos(L1,L2,E1,E2). ```

this works but not as expected.

expected output.

bapos([1,2,3], L2, 2, b).
L2 = [b|_G1869] ;
L2 = [_G1868, _G1871, b|_G1875] ;
false.

My output:

bapos([1,2,3],L2,2,b).
L2 = [b|_34474] ;
L2 = [_35132, _35138|_35140] ;
L2 = [_35132, b|_35800] ;
L2 = [_35132, _36458, b|_36466] ;
false.


【问题讨论】:

    标签: prolog predicate


    【解决方案1】:

    我想我明白了你想要做的事情,但表达方式错误。 这应该有效:

    bapos([E1|_], [_,E2|_], E1, E2).
    bapos([_,E1|_], [E2|_], E1, E2).
    bapos([_|L1], [_|L2], E1, E2):-
      bapos(L1, L2, E1, E2).
    

    前两个子句检查 E1 和 E2 是在另一个元素之前还是之后。第三个子句是递归步骤。

    示例运行:

    ?- bapos([1,2,3],L2,2,b).
    L2 = [b|_1542] ;
    L2 = [_1540, _1546, b|_1554] ;
    false.
    
    ?- bapos([1,2,3],[a,b,c],1,a).
    false.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 2023-03-11
      • 2018-12-22
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多