【问题标题】:Trying to check lines are between 2 points that exist, Prolog试图检查线是否存在于两个点之间,Prolog
【发布时间】:2017-11-09 07:00:38
【问题描述】:

我正在尝试检查线是否实际上位于规则集中存在的 2 个点之间。例如在下面的代码中,

point(a).
point(z).

line(l,k).
line(k,l).
line(k,a).
line(a,z).

line(a,z). 是实线,因为 az 都是规则集中的点,但 line(l,k). 不是实线,因为 lk 不是规则集中的实点规则集。

我是 Prolog 的新手,想要一些关于如何做到这一点的指示。

【问题讨论】:

    标签: prolog line point


    【解决方案1】:

    你可以写:

    real_line(X,Y):-line(X,Y),point(X),point(Y).
    

    Prolog 中的, 表示逻辑“和”,因此当 X,Y 成立时,上述谓词 real_line/2 成功:line(X,Y)X 是一个点,Y是一个点。

    一些例子:

    ?- real_line(a,z).
    true.
    
    ?- real_line(a,k).
    false.
    
    ?- real_line(l,k).
    false.
    
    ?- real_line(X,Y).
    X = a,
    Y = z.
    
    ?- real_line(X,z).
    X = a.
    
    ?- real_line(a,Y).
    Y = z.
    

    更新

    根据您的 cmets 找到您可以使用的所有错误行:

    findall(line(X,Y),(line(X,Y), \+ real_line(X,Y)),L).
    

    例子:

    ?- findall(line(X,Y),(line(X,Y), \+ real_line(X,Y)),L).
    L = [line(l, k), line(k, l), line(k, a)].
    

    OR 带有失败驱动的循环:

    write_incorrect_lines:-
                line(X,Y),
                \+real_line(X,Y),
                write(line(X,Y)),
                nl,
                fail;
                true.
    

    例子:

    ?- write_incorrect_lines.
    line(l,k)
    line(k,l)
    line(k,a)
    true.
    

    【讨论】:

    • 那么我将如何检查所有行是否正确?我是否必须将它们加载到函数中的列表中?
    • 你的意思是你需要所有连接的线路或者只是检查所有线路是否正确??
    • 我想搜索文件和所有不正确写入控制台的行
    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2015-11-23
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多