如何在Prolog中编写数字谓词

时间:2019-09-09 03:03:35

标签: prolog

类似于a previously asked question,我正在尝试创建一个数值函数来计算斜率。正如上述链接的答案所表明的,并且我发现,我最终得到的Arity为3,斜率/ 3看起来像这样:

import wx
import ctypes
try:
    ctypes.windll.shcore.SetProcessDpiAwareness(True)
except:
    pass


class WindowClass(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(WindowClass,self).__init__(*args, **kwargs)
        self.basicGUI()

    #GUI elements    
    def basicGUI(self):
        panel = wx.Panel(self)
        menu_bar = wx.MenuBar()
        box_sizer = wx.BoxSizer()
        box_sizer.Add(panel, 1, wx.ALL|wx.EXPAND) 

        button_text = wx.StaticText(panel, label="Select a .cpf file")
        self.file_button = wx.FilePickerCtrl(panel)
        check_button = wx.Button(panel, label='Check')

        self.Bind(wx.EVT_BUTTON, self.OnCheckButton, check_button)

        a_text = wx.StaticText(panel, label="a file status")
        b_text = wx.StaticText(panel, label="b file status")
        c_text = wx.StaticText(panel, label="c file status")
        passed_text = wx.StaticText(panel, label="passed")

        #set items on the grid
        sizer = wx.GridBagSizer(5, 5)
        sizer.Add(button_text, (0, 0))
        sizer.Add(self.file_button, (0, 2))
        sizer.Add(check_button,(1, 2))
        sizer.Add(a_text, (2, 0))
        sizer.Add(b_text, (3, 0))
        sizer.Add(c_text, (4, 0))
        sizer.Add(passed_text, (2, 1))

        #make border
        border = wx.BoxSizer()
        border.Add(sizer, 1, wx.ALL|wx.EXPAND, 5)
        #use sizers
        panel.SetSizerAndFit(border)  
        self.SetSizerAndFit(box_sizer)  
        #show GUI
        self.SetTitle('file check')
        self.Centre()
        self.Show(True)

    # indentations are very important in Python
    def OnCheckButton(self, event): 
        print("perform check")   #debug line
        print(self.file_button.GetPath())

app = wx.App()
WindowClass(None)
print("passed")
app.MainLoop()

我的下一个问题是:如何使用? def all_sum(number): total = 0 if number > 0: for e in str(number): if e.isdigit(): total += int(e) else: pass return total a = all_sum(567897) 最终将包含slope((Xa, Ya), (Xb, Yb), S) :- S is div((Yb - Ya), (Xb - Xa)). S,但作为序言新手,我看不到如何在规则中使用它。

1

还是其他?

1 个答案:

答案 0 :(得分:3)

您的谓词:

answer((Xa, Ya), (Xb, Yb)) :-
    slope((Xa, Ya), (Xb, Yb), 1),
    slope((Xa, Ya), (Xb, Yb), -1).

(Xa, Ya)(Yb, Yb)之间的斜率应为1(Xa, Ya)(Yb, Yb)之间的斜率应为-1。除非斜率可以具有两个值,否则不会发生。

此外,我并不认为在这里使用坡度是个好主意。如果Xb-Xa为零,则由于除以零,将导致评估错误。

假设1-1之差的绝对值与绝对值相同,则可以说两个值的斜率是YbYa XbYa之间的差异。

我们可以这样表达:

answer((Xa, Ya), (Xb, Yb)) :-
    abs(Xa - Xb) =:= abs(Ya - Yb).